내가 만든 RTOS에서는 우선순위 63이 제일 높다.
이 태스크는 가장 높은 태스크로서 화면을 계속 갱신해 준다.
~cpp
// Task 0 is Highest Task :: priority 63
void mn_task()
{
while(1){
// Print Logo
char *sen = ":::::::: Little / Simple Real Time Kernel ::::::: \n";
char *sen1 = " LIB_OS Ver 0.27 :: http://www.cse.cau.ac.kr\n";
char *sen2 = "Check Running Task \n";
char *sen3 = "Task Name Priority StackSize Running \n";
LIB_VRAM_STRING(0,0,sen,0x04);
LIB_VRAM_STRING(0,1,sen1,0x07);
LIB_VRAM_STRING(0,2,sen2,0x07);
LIB_VRAM_STRING(0,4,sen3,0x09);
// Show the task delay , usage and
LIB_TASK_DISPLAY(10);
LIB_VRAM_STRING(0,12,"Total Interrupt Count :\n",0x09);
LIB_VRAM_NUM(26,12,LIB_INT_COUNT,0x07);
LIB_TIME_DLY(63,5); // 이 태스크에 딜레이를 주는 소스 부분
}
}
이건 사용자 태스크인 태스크1 이다.
~cpp
// Task 1 :: priority 60
void task1()
{
char msg1;
msg1 = 'A';
while(1) {
// TASK STATE DISPLAY
LIB_TASK_DISPLAY(5);
// semaphore section
LIB_pend_sem(semaphore , 50);
LIB_post_sem(semaphore);
// send message :: msg1
if ( msg1 == 'Z' ) msg1 = 'A';
else msg1++;
LIB_VRAM_CHAR(56,5,msg1,0x16);
LIB_post_msg(message,&msg1);
LIB_TIME_DLY(60,10);
}
}
다음은 실제적인 메인 펑션이다.
LIB_create_task (char* string,int,&task_point,task_size) 함수는
태스크들을 만들어주는 함수이다.
~cpp
void main()
{
// clear CRT
LIB_VRAM_CLR(); // 화면을 지워주고
// init Scheduler Queue , TICKS and Parallel Port
LIB_Init_Schedu(); // 스케쥴링을 위한 우선순위 큐를 초기화 하고
LIB_TIME_RATE(); // 타이머를 정의하고
LIB_init_prl(0); // 패러럴 포트를 정리한다.
// create The Sample Task 1,2
#if !defined(DEBUG)
LIB_create_task("Management\n",63,mn_task,&TaskStack0[256]); // 매니져 함수를 만들어준다.
LIB_create_task("task1\n",60,task1,&TaskStack1[256]); // 사용자 태스크 1을 만들어준다.
LIB_create_task("task2\n",59,task2,&TaskStack2[256]); // 사용자 태스크 2를 만들어준다.
#endif
LIB_create_task("StatTask\n",LIB_IDLE_PRIORITY + 1,LIB_TASK_CPU_STAT,&OSStack[256]); // 상태를 알아보는 태스크를 만든다.
LIB_create_task("IdleTask\n",LIB_IDLE_PRIORITY,idle_task,&TaskStack3[256]); // 유휴상태일때 돌아가는 idle태스크를 만든다.
여기까지는 태스크에 대한 정의만 나왔다.
다음에는 세마포어를 2개 만들고 메세지 큐를 만드는 소스이다.
~cpp
// create semaphore and message
semaphore = LIB_create_sem(2);
message = LIB_create_msg(NULL);
이제 이렇게 되면 각각의 코드로 태스크와 세마포어.메세지가 만들어졌다.
이제 OS를 돌리기 위해 ISR 루틴을 실행시켜준다.
~cpp
// init ISR
LIB_INIT_ISR();
while(1) {};
LIB_VRAM_STRING(0,0," :: FATAL ERROR :: \n",0x07);
}
여기서는 대략적인 주된 소스만 나와있다.