|
溫馨提示: 1.該內(nèi)核僅供學(xué)習(xí)和參考使用。
2.大概率不會(huì)再更新(沒(méi)必要造輪子)。
3.該內(nèi)核并不成熟,如要使用操作系統(tǒng)請(qǐng)尋找市面上成熟的內(nèi)核。 4.個(gè)人不喜歡大片的注釋,注釋僅僅說(shuō)明大致功能,細(xì)節(jié)需自行理解。
- #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; //時(shí)間指針
- uchar event_End; //時(shí)間結(jié)束
- uchar ready; //就緒狀態(tài)
- uchar priority; //優(yōu)先級(jí)
- 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;
- //添加任務(wù)到優(yōu)先級(jí)鏈
- void ADD_Task_To_Priority_List(Task_List * list);
- //從優(yōu)先級(jí)鏈中刪除任務(wù)
- void DEC_Task_Of_Priority_List(Task_List * list);
- static Task_List Block_List_Head; // 阻塞鏈表表頭
- static Task_List* Now_Task; // 目前啟用任務(wù)
- static Task_Ready_List Task_Ready_List_Head;// 優(yōu)先級(jí)鏈表表頭
- static uchar data Stack_Start; // 棧開(kāi)始
- static uchar data Stack_Last; // 上一個(gè)棧尾
- static uchar data Stack_St; // 中間變量
- //任務(wù)調(diào)度函數(shù)
- #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;
-
- // 搜索阻塞鏈表中達(dá)成條件的任務(wù)
- for(Task_Now = &Block_List_Head; Task_Now->Next != NULL;)
- {
- if(Task_Now->Next->event_Pointer[0] >= Task_Now->Next->event_End)
- {
- //將其從阻塞鏈表中移除,并添加到優(yōu)先級(jí)任務(wù)鏈表
- 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;
- }
- //修改當(dāng)前啟用任務(wù)
- Now_Task = Task_Ready_List_Head.Next->Next_Task;
- //修改優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
- if(Now_Task->Next != NULL)// 當(dāng)前啟用任務(wù)不是最后一個(gè)任務(wù)
- Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
- else // 當(dāng)前啟用任務(wù)是最后一個(gè)任務(wù)
- 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;
-
- }
- //任務(wù)阻塞
- 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++);
- }
- //任務(wù)等待時(shí)間
- 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;
-
- }
- // 添加任務(wù)
- void Task_ADD(void * x, uchar Stack_Growth, uchar priority)
- {
- Task_List * list = malloc(sizeof(Task_List));// 定義任務(wù)鏈表
-
- list->priority = priority; //優(yōu)先級(jí)賦值
- list->head_Stack =(uchar *)Stack_Start ; //棧頭地址賦值
- //將任務(wù)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; //修改下一個(gè)棧開(kāi)始位置
- list->tail_Stack = &list->head_Stack[15]; //棧尾地址賦值
- list->ready = 1; //阻塞/就緒態(tài)賦值
- list->Next = NULL;
- ADD_Task_To_Priority_List(list);
-
- }
- //從優(yōu)先級(jí)任務(wù)鏈中刪除一個(gè)任務(wù)(將任務(wù)從就緒態(tài)中移除)
- 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;
- //查找優(yōu)先級(jí)鏈表內(nèi)是否已有所需優(yōu)先級(jí)
- for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
- {
- if(priority_List->Next->priority > priority)return;// 錯(cuò)誤, 沒(méi)有找著所需優(yōu)先級(jí)
- if(priority_List->Next->priority == priority)break;// 當(dāng)前鏈表優(yōu)先級(jí)等于所需優(yōu)先級(jí)
- }
- if(priority_List->Next == NULL)return;// 錯(cuò)誤, 沒(méi)有找著所需優(yōu)先級(jí)
- if(priority_List->Next->Head_Task == NULL)goto ASDN;// 錯(cuò)誤,當(dāng)前優(yōu)先級(jí)內(nèi)沒(méi)有任務(wù)
-
- if(priority_List->Next->Head_Task == list)// 判斷優(yōu)先級(jí)任務(wù)頭是不是所需任務(wù)
- {
- priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務(wù)
- goto ASDN;
- }
- //在當(dāng)前優(yōu)先級(jí)任務(wù)鏈內(nèi)搜索所需任務(wù)
- for(list1 = priority_List->Next->Head_Task; list1->Next != NULL; list1 = list1->Next)
- {
- if(list1->Next == list)
- {
- list1->Next = list1->Next->Next;// 從優(yōu)先級(jí)任務(wù)鏈中刪除任務(wù)
- break;
- }
- }
- ASDN:
- if(priority_List->Next->Head_Task == NULL)//當(dāng)前優(yōu)先級(jí)內(nèi)沒(méi)有任何任務(wù),刪除當(dāng)前優(yōu)先級(jí)任務(wù)鏈
- {
- new_priority_List = priority_List->Next;
- priority_List->Next = priority_List->Next->Next;
- // free(new_priority_List);
- }
- }
- //添加一個(gè)任務(wù)到優(yōu)先級(jí)任務(wù)鏈(將任務(wù)添加到就緒態(tài))
- void ADD_Task_To_Priority_List(Task_List * list)
- {
- uchar priority = list->priority;
- Task_Ready_List* priority_List;
- Task_Ready_List* new_priority_List;
- //查找優(yōu)先級(jí)鏈表內(nèi)是否已有當(dāng)前優(yōu)先級(jí)
- 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;// 當(dāng)前鏈表優(yōu)先級(jí)等于當(dāng)前優(yōu)先級(jí)
- }
- if(priority_List->Next == NULL)// 優(yōu)先級(jí)鏈表內(nèi)沒(méi)有當(dāng)前優(yōu)先級(jí)
- {
- NEWHEAD:
- //新建一個(gè)優(yōu)先級(jí)頭
- 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;
- }
- //更換優(yōu)先級(jí)鏈內(nèi)頭任務(wù)
- 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);// 添加空閑任務(wù)
- //設(shè)置優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
- for(priority_List = Task_Ready_List_Head.Next; priority_List != NULL; priority_List = priority_List->Next)
- priority_List->Next_Task = priority_List->Head_Task;
- //獲得當(dāng)前啟用任務(wù)
- Now_Task = Task_Ready_List_Head.Next->Head_Task;
- //修改優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
- if(Now_Task->Next != NULL)// 當(dāng)前啟用任務(wù)不是最后一個(gè)任務(wù)
- Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
- else // 當(dāng)前啟用任務(wù)是最后一個(gè)任務(wù)
- 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
- }
- //空閑函數(shù)
- void Free_Task()
- {
- while(1)
- {
- EA = 1;
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|