내가 만든 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) 함수는
태스크들을 만들어주는 함수이다.
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개 만들고 메세지 큐를 만드는 소스이다.
이제 OS를 돌리기 위해 ISR 루틴을 실행시켜준다.
다음에는 세마포어를 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); }
여기서는 대략적인 주된 소스만 나와있다.