搭建一個多任務調度環境

目標實現一個多任務環境。

1. 系統可以多任務執行;

2. 任務可以模塊化編程;

3. 沒有調度算法, 調度點由用戶決定。


操作系統描述的是多任務處理。多任務的意思是在宏觀上多個任務是同時在運行的,但是微觀上,任何一個時刻只有一個任務在運行。

操作系統有一個任務控制塊的結構體,裏面有一個最重要的成員:棧指針,記錄任務在切換時候上下文的位置。先定義TCB結構體

typedef struct TCB

STACK stack_ptr;

TCB


聲明創建函數

void task_creat(TCB*tcb, TASK_ENTRY fun, STACK *stack)

創建任務的時候,任務的棧指針應該指向棧底,因爲任務被調度運行,總是出棧,棧指針是增長的。

void task_creat(TCB*tcb, TASK_ENTRY fun, STACK *stack)

{

    tcb->stack_ptr =stack_init(stack, size, fun);

}


所以有棧初始化函數

U32 *stack_init(STACK *p_stk_base, U32 stk_size, TASK_ENTRY p_task);

初始化棧指針,把任務地址(本質是一個函數)壓入棧,然後返回棧底指針。

現在main裏創建兩個任務,然後讓CPU調度。

void main()

{

    uart_init();

    char *ptr ="WELLCOME TO YSJ_OS\n";

    task_creat(&tcb1,fun1, stack1);

    task_creat(&tcb2,fun2, stack2);

     new_task = &tcb1;

     old_task = &tcb2; 

     /*start_schedule function is in asm*/

     extern void start_schedule();

     start_schedule();

     while (1)

    {

          ;

          //uart_print_str(ptr);

    };

}

大體框架寫出來後,應該補充什麼的就補充什麼,比如兩個任務的任務控制塊tcb1tcb2、任務函數fun1fun2、開始調度函數start_schedulenew_task函數是指要被調度運行的任務,old_task函數是指要被調換出去停止運行的任務。

void fun1(void *temp)

{

    while (1)

   {

        uart_print_str("fun1 print\n");

        old_task =&tcb1;

        new_task =&tcb2;

       schedule();

     }

}

void fun2(void *temp)

{

    while (1)

    {

        uart_print_str("fun2 print\n");

    };

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章