溫馨提示: 1.該內核僅供學習和參考使用。
2.大概率不會再更新(沒必要造輪子)。
3.該內核并不成熟,如要使用操作系統請尋找市面上成熟的內核。 4.個人不喜歡大片的注釋,注釋僅僅說明大致功能,細節需自行理解。
- #include <Task_Core.H>
- #include <stdlib.h>
- #include <Config.H>
- void Free_Task();
- struct Task_Control_Block_List{
- uchar* head_Stack; //棧頭指針
- uchar* tail_Stack; //棧尾指針
- uchar* event_Pointer; //時間指針
- uchar event_End; //時間結束
- uchar ready; //就緒狀態
- uchar priority; //優先級
- struct Task_Control_Block_List* Next;
-
- };
- typedef struct Task_Control_Block_List Task_List;
- struct Task_Priority_List{
- struct Task_Priority_List * Next;
- struct Task_Control_Block_List* Head_Task;
- struct Task_Control_Block_List* Next_Task;
- uchar priority;
- }Task_Priority_List;
- typedef struct Task_Priority_List Task_Ready_List;
- //添加任務到優先級鏈
- void ADD_Task_To_Priority_List(Task_List * list);
- //從優先級鏈中刪除任務
- void DEC_Task_Of_Priority_List(Task_List * list);
- static Task_List Block_List_Head; // 阻塞鏈表表頭
- static Task_List* Now_Task; // 目前啟用任務
- static Task_Ready_List Task_Ready_List_Head;// 優先級鏈表表頭
- static uchar data Stack_Start; // 棧開始
- static uchar data Stack_Last; // 上一個棧尾
- static uchar data Stack_St; // 中間變量
- //任務調度函數
- #pragma asm
- CSEG AT 0000BH
- LJMP Timer
- #pragma endasm
- void Timer() interrupt 1
- {
- Task_List* Task_Now;
- Task_List* Task_Now1;
- uchar* stack;
- uchar a;
- int i;
- //禁止中斷嵌套
- EA = 0;
- //保存上文
- #pragma asm
- MOV Stack_Last,SP
- MOV SP, Stack_St
- #pragma endasm
- Now_Task->tail_Stack =(uchar *) Stack_Last;
-
- // 搜索阻塞鏈表中達成條件的任務
- for(Task_Now = &Block_List_Head; Task_Now->Next != NULL;)
- {
- if(Task_Now->Next->event_Pointer[0] >= Task_Now->Next->event_End)
- {
- //將其從阻塞鏈表中移除,并添加到優先級任務鏈表
- Task_Now->Next->event_Pointer = NULL;
- Task_Now->Next->ready = 1;
- Task_Now1 = Task_Now->Next;
- Task_Now->Next = Task_Now->Next->Next;
- ADD_Task_To_Priority_List(Task_Now1);
- continue;
- }
- Task_Now = Task_Now->Next;
- }
- //修改當前啟用任務
- Now_Task = Task_Ready_List_Head.Next->Next_Task;
- //修改優先級鏈表中下一個啟用任務
- if(Now_Task->Next != NULL)// 當前啟用任務不是最后一個任務
- Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
- else // 當前啟用任務是最后一個任務
- Task_Ready_List_Head.Next->Next_Task = Task_Ready_List_Head.Next->Head_Task;
-
- //更換下文
- Stack_Last = Now_Task->tail_Stack;
- #pragma asm
- MOV SP,Stack_Last
- #pragma endasm
-
- EA = 1;
-
- }
- //任務阻塞
- void Task_Block(uchar *event_pointer, uchar event_end)
- {
- uchar i;
- EA = 0;
-
- Now_Task->event_Pointer = event_pointer;
- Now_Task->event_End = event_end;
- Now_Task->ready = 0;
- DEC_Task_Of_Priority_List(Now_Task);
- Now_Task->Next = Block_List_Head.Next;
- Block_List_Head.Next = Now_Task;
- EA = 1;
- TF0 = 1;
- for(i = 0; i < 8; i++);
- }
- //任務等待時間
- void Task_Wait(uchar Ms)
- {
- uchar i;
- EA = 0;
- for(i = 0; i < 8; i++)
- {
- if(biao[i] < 128)break;
- }
- if(i == 8)return;
- biao[i] = 128;
- Task_Block(&biao[i], Ms+128);
- biao[i] = 0;
- }
- void Task_Init()
- {
- TMOD = 0x00;
- TH0 = 0xF6;
- TL0 = 0x3B;
- TR0 = 1;
- ET0 = 1;
- #pragma asm
- MOV Stack_Start,SP
- #pragma endasm
- Stack_Start += 10;
- // 初始化鏈表頭
- Task_Ready_List_Head.priority = 0;
- Task_Ready_List_Head.Head_Task = NULL;
- Task_Ready_List_Head.Next = NULL;
- Task_Ready_List_Head.Next_Task = NULL;
-
- }
- // 添加任務
- void Task_ADD(void * x, uchar Stack_Growth, uchar priority)
- {
- Task_List * list = malloc(sizeof(Task_List));// 定義任務鏈表
-
- list->priority = priority; //優先級賦值
- list->head_Stack =(uchar *)Stack_Start ; //棧頭地址賦值
- //將任務PC指針壓入棧
- #pragma asm
- MOV Stack_Last,SP
- MOV SP ,Stack_Start
- MOV DPTR,#x?450
- LCALL ?C?PLDXDATA
- MOV R6,AR2
- MOV R7,AR1
- MOV A,R7
- PUSH ACC
- MOV A,R6
- PUSH ACC
- MOV SP, Stack_Last
- #pragma endasm
- Stack_Start += Stack_Growth + 15; //修改下一個棧開始位置
- list->tail_Stack = &list->head_Stack[15]; //棧尾地址賦值
- list->ready = 1; //阻塞/就緒態賦值
- list->Next = NULL;
- ADD_Task_To_Priority_List(list);
-
- }
- //從優先級任務鏈中刪除一個任務(將任務從就緒態中移除)
- void DEC_Task_Of_Priority_List(Task_List * list)
- {
- uchar priority = list->priority;
- Task_Ready_List* priority_List;
- Task_Ready_List* new_priority_List;
- Task_List * list1;
- //查找優先級鏈表內是否已有所需優先級
- for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
- {
- if(priority_List->Next->priority > priority)return;// 錯誤, 沒有找著所需優先級
- if(priority_List->Next->priority == priority)break;// 當前鏈表優先級等于所需優先級
- }
- if(priority_List->Next == NULL)return;// 錯誤, 沒有找著所需優先級
- if(priority_List->Next->Head_Task == NULL)goto ASDN;// 錯誤,當前優先級內沒有任務
-
- if(priority_List->Next->Head_Task == list)// 判斷優先級任務頭是不是所需任務
- {
- priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務
- goto ASDN;
- }
- //在當前優先級任務鏈內搜索所需任務
- for(list1 = priority_List->Next->Head_Task; list1->Next != NULL; list1 = list1->Next)
- {
- if(list1->Next == list)
- {
- list1->Next = list1->Next->Next;// 從優先級任務鏈中刪除任務
- break;
- }
- }
- ASDN:
- if(priority_List->Next->Head_Task == NULL)//當前優先級內沒有任何任務,刪除當前優先級任務鏈
- {
- new_priority_List = priority_List->Next;
- priority_List->Next = priority_List->Next->Next;
- // free(new_priority_List);
- }
- }
- //添加一個任務到優先級任務鏈(將任務添加到就緒態)
- void ADD_Task_To_Priority_List(Task_List * list)
- {
- uchar priority = list->priority;
- Task_Ready_List* priority_List;
- Task_Ready_List* new_priority_List;
- //查找優先級鏈表內是否已有當前優先級
- for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
- {
- if(priority_List->Next->priority > priority)goto NEWHEAD;
- if(priority_List->Next->priority == priority)break;// 當前鏈表優先級等于當前優先級
- }
- if(priority_List->Next == NULL)// 優先級鏈表內沒有當前優先級
- {
- NEWHEAD:
- //新建一個優先級頭
- new_priority_List = malloc(sizeof(Task_Ready_List));
- new_priority_List->Next = priority_List->Next;
- priority_List->Next = new_priority_List;
- priority_List->Next->priority = priority;
- priority_List->Next->Next_Task = list;
- priority_List->Next->Head_Task = NULL;
- }
- //更換優先級鏈內頭任務
- list->Next = priority_List->Next->Head_Task;
- priority_List->Next->Head_Task = list;
- }
- void Task_Start()
- {
- uchar* a;
- Task_Ready_List* priority_List;
- #pragma asm
- MOV Stack_St,SP
- #pragma endasm
- Task_ADD(Free_Task, 2,55);// 添加空閑任務
- //設置優先級鏈表中下一個啟用任務
- for(priority_List = Task_Ready_List_Head.Next; priority_List != NULL; priority_List = priority_List->Next)
- priority_List->Next_Task = priority_List->Head_Task;
- //獲得當前啟用任務
- Now_Task = Task_Ready_List_Head.Next->Head_Task;
- //修改優先級鏈表中下一個啟用任務
- if(Now_Task->Next != NULL)// 當前啟用任務不是最后一個任務
- Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
- else // 當前啟用任務是最后一個任務
- Task_Ready_List_Head.Next->Next_Task = Task_Ready_List_Head.Next->Head_Task;
- // 修改棧指針指向位置
- a = Task_Ready_List_Head.Next->Head_Task->tail_Stack;
- #pragma asm
- MOV SP, ACC
- POP AR7
- POP AR6
- POP AR5
- POP AR4
- POP AR3
- POP AR2
- POP AR1
- POP AR0
- POP PSW
- POP DPL
- POP DPH
- POP B
- POP ACC
- #pragma endasm
- }
- //空閑函數
- void Free_Task()
- {
- while(1)
- {
- EA = 1;
- }
- }
復制代碼
|