目標實現一個多任務環境。
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);
};
}
大體框架寫出來後,應該補充什麼的就補充什麼,比如兩個任務的任務控制塊tcb1、tcb2、任務函數fun1、fun2、開始調度函數start_schedule。new_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");
};
}