找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 5412|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

自己摸了一個(gè)操作系統(tǒng)內(nèi)核,發(fā)出來(lái)給大家看看。

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:776954 發(fā)表于 2020-7-28 09:24 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
溫馨提示:      1.該內(nèi)核僅供學(xué)習(xí)和參考使用。
      2.大概率不會(huì)再更新(沒(méi)必要造輪子)。
      3.該內(nèi)核并不成熟,如要使用操作系統(tǒng)請(qǐng)尋找市面上成熟的內(nèi)核。      4.個(gè)人不喜歡大片的注釋,注釋僅僅說(shuō)明大致功能,細(xì)節(jié)需自行理解。
  1. #include <Task_Core.H>
  2. #include <stdlib.h>
  3. #include <Config.H>

  4. void Free_Task();

  5. struct Task_Control_Block_List{
  6.         uchar* head_Stack;                //棧頭指針
  7.         uchar* tail_Stack;                //棧尾指針
  8.         uchar* event_Pointer; //時(shí)間指針
  9.         uchar  event_End;                        //時(shí)間結(jié)束
  10.         uchar  ready;                                        //就緒狀態(tài)
  11.         uchar  priority;                        //優(yōu)先級(jí)
  12.         struct Task_Control_Block_List* Next;
  13.        
  14. };
  15. typedef struct Task_Control_Block_List Task_List;
  16. struct Task_Priority_List{
  17.         struct Task_Priority_List * Next;
  18.         struct Task_Control_Block_List* Head_Task;
  19.         struct Task_Control_Block_List* Next_Task;
  20.         uchar  priority;
  21. }Task_Priority_List;
  22. typedef struct Task_Priority_List Task_Ready_List;
  23. //添加任務(wù)到優(yōu)先級(jí)鏈
  24. void ADD_Task_To_Priority_List(Task_List * list);
  25. //從優(yōu)先級(jí)鏈中刪除任務(wù)
  26. void DEC_Task_Of_Priority_List(Task_List * list);

  27. static Task_List Block_List_Head;                                                //   阻塞鏈表表頭
  28. static Task_List* Now_Task;                                                                         //   目前啟用任務(wù)
  29. static Task_Ready_List Task_Ready_List_Head;// 優(yōu)先級(jí)鏈表表頭

  30. static uchar data Stack_Start;                                                        // 棧開(kāi)始
  31. static uchar data Stack_Last;                                                                // 上一個(gè)棧尾
  32. static uchar data Stack_St;                                                                        // 中間變量

  33. //任務(wù)調(diào)度函數(shù)
  34. #pragma asm
  35. CSEG        AT        0000BH
  36. LJMP        Timer
  37. #pragma endasm
  38. void Timer() interrupt 1
  39. {
  40.         Task_List* Task_Now;
  41.         Task_List* Task_Now1;
  42.         uchar* stack;
  43.         uchar a;
  44.         int i;
  45.         //禁止中斷嵌套
  46.         EA = 0;
  47.         //保存上文
  48.         #pragma asm
  49.         MOV          Stack_Last,SP
  50.         MOV   SP, Stack_St
  51.         #pragma endasm
  52.         Now_Task->tail_Stack =(uchar *) Stack_Last;
  53.        
  54.         // 搜索阻塞鏈表中達(dá)成條件的任務(wù)
  55.         for(Task_Now = &Block_List_Head; Task_Now->Next != NULL;)
  56.         {
  57.                 if(Task_Now->Next->event_Pointer[0] >= Task_Now->Next->event_End)
  58.                 {
  59.                         //將其從阻塞鏈表中移除,并添加到優(yōu)先級(jí)任務(wù)鏈表
  60.                                 Task_Now->Next->event_Pointer = NULL;
  61.                                 Task_Now->Next->ready = 1;
  62.                                 Task_Now1 = Task_Now->Next;
  63.                                 Task_Now->Next = Task_Now->Next->Next;
  64.                                 ADD_Task_To_Priority_List(Task_Now1);
  65.                                 continue;
  66.                 }
  67.                  Task_Now = Task_Now->Next;
  68.         }
  69.         //修改當(dāng)前啟用任務(wù)
  70.         Now_Task = Task_Ready_List_Head.Next->Next_Task;
  71.         //修改優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
  72.         if(Now_Task->Next != NULL)// 當(dāng)前啟用任務(wù)不是最后一個(gè)任務(wù)
  73.                 Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
  74.         else                                                                                        // 當(dāng)前啟用任務(wù)是最后一個(gè)任務(wù)
  75.                 Task_Ready_List_Head.Next->Next_Task = Task_Ready_List_Head.Next->Head_Task;
  76.        
  77.         //更換下文
  78.         Stack_Last = Now_Task->tail_Stack;
  79.         #pragma asm
  80.         MOV  SP,Stack_Last
  81.         #pragma endasm
  82.        
  83.         EA = 1;
  84.        
  85. }
  86. //任務(wù)阻塞
  87. void Task_Block(uchar *event_pointer, uchar event_end)
  88. {
  89.         uchar i;
  90.         EA = 0;
  91.        
  92.         Now_Task->event_Pointer = event_pointer;
  93.         Now_Task->event_End = event_end;
  94.         Now_Task->ready = 0;
  95.         DEC_Task_Of_Priority_List(Now_Task);
  96.         Now_Task->Next = Block_List_Head.Next;
  97.         Block_List_Head.Next = Now_Task;
  98.         EA = 1;
  99.         TF0 = 1;
  100.         for(i = 0; i < 8; i++);
  101. }
  102. //任務(wù)等待時(shí)間
  103. void Task_Wait(uchar Ms)
  104. {
  105.         uchar i;
  106.         EA = 0;
  107.         for(i = 0; i < 8; i++)
  108.         {
  109.                 if(biao[i] < 128)break;
  110.         }
  111.         if(i == 8)return;
  112.         biao[i] = 128;
  113.         Task_Block(&biao[i], Ms+128);
  114.         biao[i] = 0;
  115. }


  116. void Task_Init()
  117. {
  118.         TMOD = 0x00;
  119.         TH0 = 0xF6;
  120.         TL0 = 0x3B;
  121.         TR0 = 1;
  122.         ET0 = 1;
  123.         #pragma asm
  124.         MOV          Stack_Start,SP
  125.         #pragma endasm
  126.         Stack_Start += 10;
  127.         // 初始化鏈表頭
  128.         Task_Ready_List_Head.priority  = 0;
  129.         Task_Ready_List_Head.Head_Task = NULL;
  130.         Task_Ready_List_Head.Next      = NULL;
  131.         Task_Ready_List_Head.Next_Task = NULL;
  132.        
  133. }
  134. // 添加任務(wù)
  135. void Task_ADD(void * x, uchar Stack_Growth, uchar priority)
  136. {
  137.         Task_List * list = malloc(sizeof(Task_List));// 定義任務(wù)鏈表
  138.        
  139.         list->priority = priority;                                                                        //優(yōu)先級(jí)賦值
  140.         list->head_Stack =(uchar *)Stack_Start ;    //棧頭地址賦值
  141.         //將任務(wù)PC指針壓入棧
  142.         #pragma asm
  143.         MOV Stack_Last,SP
  144.         MOV SP ,Stack_Start
  145.         MOV          DPTR,#x?450
  146.         LCALL        ?C?PLDXDATA
  147.         MOV          R6,AR2
  148.         MOV          R7,AR1
  149.         MOV          A,R7
  150.         PUSH ACC
  151.         MOV          A,R6
  152.         PUSH ACC
  153.         MOV SP, Stack_Last
  154.         #pragma endasm
  155.         Stack_Start += Stack_Growth + 15;                                          //修改下一個(gè)棧開(kāi)始位置
  156.         list->tail_Stack = &list->head_Stack[15];                //棧尾地址賦值
  157.         list->ready = 1;                                                                                                                //阻塞/就緒態(tài)賦值
  158.         list->Next = NULL;
  159.         ADD_Task_To_Priority_List(list);
  160.        
  161. }
  162. //從優(yōu)先級(jí)任務(wù)鏈中刪除一個(gè)任務(wù)(將任務(wù)從就緒態(tài)中移除)
  163. void DEC_Task_Of_Priority_List(Task_List * list)
  164. {
  165.         uchar priority = list->priority;
  166.         Task_Ready_List* priority_List;                                                               
  167.         Task_Ready_List* new_priority_List;
  168.         Task_List * list1;
  169.         //查找優(yōu)先級(jí)鏈表內(nèi)是否已有所需優(yōu)先級(jí)
  170.         for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
  171.         {
  172.                 if(priority_List->Next->priority >  priority)return;// 錯(cuò)誤, 沒(méi)有找著所需優(yōu)先級(jí)
  173.                 if(priority_List->Next->priority == priority)break;// 當(dāng)前鏈表優(yōu)先級(jí)等于所需優(yōu)先級(jí)
  174.         }
  175.         if(priority_List->Next == NULL)return;// 錯(cuò)誤, 沒(méi)有找著所需優(yōu)先級(jí)
  176.         if(priority_List->Next->Head_Task == NULL)goto ASDN;// 錯(cuò)誤,當(dāng)前優(yōu)先級(jí)內(nèi)沒(méi)有任務(wù)
  177.        
  178.         if(priority_List->Next->Head_Task == list)// 判斷優(yōu)先級(jí)任務(wù)頭是不是所需任務(wù)
  179.         {
  180.                 priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務(wù)
  181.                 goto ASDN;
  182.         }
  183.         //在當(dāng)前優(yōu)先級(jí)任務(wù)鏈內(nèi)搜索所需任務(wù)
  184.         for(list1 = priority_List->Next->Head_Task; list1->Next != NULL; list1 = list1->Next)
  185.         {
  186.                 if(list1->Next == list)
  187.                 {
  188.                         list1->Next = list1->Next->Next;// 從優(yōu)先級(jí)任務(wù)鏈中刪除任務(wù)
  189.                         break;
  190.                 }
  191.         }
  192.         ASDN:
  193.         if(priority_List->Next->Head_Task == NULL)//當(dāng)前優(yōu)先級(jí)內(nèi)沒(méi)有任何任務(wù),刪除當(dāng)前優(yōu)先級(jí)任務(wù)鏈
  194.         {
  195.                 new_priority_List = priority_List->Next;
  196.                 priority_List->Next = priority_List->Next->Next;
  197.         //        free(new_priority_List);
  198.         }
  199. }
  200. //添加一個(gè)任務(wù)到優(yōu)先級(jí)任務(wù)鏈(將任務(wù)添加到就緒態(tài))
  201. void ADD_Task_To_Priority_List(Task_List * list)
  202. {
  203.         uchar priority = list->priority;
  204.         Task_Ready_List* priority_List;                                                               
  205.         Task_Ready_List* new_priority_List;
  206.         //查找優(yōu)先級(jí)鏈表內(nèi)是否已有當(dāng)前優(yōu)先級(jí)
  207.         for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
  208.         {
  209.                 if(priority_List->Next->priority >  priority)goto NEWHEAD;
  210.                 if(priority_List->Next->priority == priority)break;// 當(dāng)前鏈表優(yōu)先級(jí)等于當(dāng)前優(yōu)先級(jí)
  211.         }
  212.         if(priority_List->Next == NULL)// 優(yōu)先級(jí)鏈表內(nèi)沒(méi)有當(dāng)前優(yōu)先級(jí)
  213.         {
  214.                 NEWHEAD:
  215.                 //新建一個(gè)優(yōu)先級(jí)頭
  216.                 new_priority_List = malloc(sizeof(Task_Ready_List));
  217.                 new_priority_List->Next = priority_List->Next;
  218.                 priority_List->Next = new_priority_List;
  219.                 priority_List->Next->priority = priority;
  220.                 priority_List->Next->Next_Task = list;
  221.                 priority_List->Next->Head_Task = NULL;
  222.         }
  223.         //更換優(yōu)先級(jí)鏈內(nèi)頭任務(wù)
  224.         list->Next = priority_List->Next->Head_Task;
  225.         priority_List->Next->Head_Task = list;
  226. }
  227. void Task_Start()
  228. {
  229.         uchar* a;
  230.         Task_Ready_List* priority_List;                                                               
  231.         #pragma asm
  232.         MOV          Stack_St,SP
  233.         #pragma endasm
  234.         Task_ADD(Free_Task, 2,55);// 添加空閑任務(wù)
  235.         //設(shè)置優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
  236.         for(priority_List = Task_Ready_List_Head.Next; priority_List != NULL; priority_List = priority_List->Next)
  237.                 priority_List->Next_Task = priority_List->Head_Task;
  238.         //獲得當(dāng)前啟用任務(wù)
  239.         Now_Task = Task_Ready_List_Head.Next->Head_Task;
  240.         //修改優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
  241.         if(Now_Task->Next != NULL)// 當(dāng)前啟用任務(wù)不是最后一個(gè)任務(wù)
  242.                 Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
  243.         else                                                                                        // 當(dāng)前啟用任務(wù)是最后一個(gè)任務(wù)
  244.                 Task_Ready_List_Head.Next->Next_Task = Task_Ready_List_Head.Next->Head_Task;
  245.         // 修改棧指針指向位置
  246.         a = Task_Ready_List_Head.Next->Head_Task->tail_Stack;
  247.         #pragma asm
  248.         MOV SP, ACC
  249.         POP          AR7
  250.         POP          AR6
  251.         POP          AR5
  252.         POP          AR4
  253.         POP          AR3
  254.         POP          AR2
  255.         POP          AR1
  256.         POP          AR0
  257.         POP          PSW
  258.         POP          DPL
  259.         POP          DPH
  260.         POP          B
  261.         POP          ACC
  262.         #pragma endasm
  263. }
  264. //空閑函數(shù)
  265. void Free_Task()
  266. {
  267.         while(1)
  268.         {
  269.                 EA = 1;
  270.         }
  271. }


復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏11 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:564182 發(fā)表于 2020-8-5 16:28 來(lái)自觸屏版 | 只看該作者
可以的,在完善一下。
回復(fù)

使用道具 舉報(bào)

板凳
ID:776954 發(fā)表于 2020-8-11 15:21 | 只看該作者
更新:
1.刪除了所有匯編內(nèi)容。
2.新增事件喚醒函數(shù),現(xiàn)在可以方便的設(shè)計(jì)喚醒條件,并且可以知曉是由什么喚醒的任務(wù)。
-----------------------------------------------------------------------------------------------------------
  1. #include <Task_Core.H>
  2. #include <stdlib.h>
  3. #include <Config.H>


  4. /*------任務(wù)TCB結(jié)構(gòu)體-------
  5. //提示:任務(wù)棧內(nèi)不包括局部變量
  6. ----------------------------*/
  7. struct Task_Control_Block_List{
  8.         uchar* head_Stack;                                                //任務(wù)棧頭
  9.         uchar* tail_Stack;                                                //任務(wù)棧尾
  10.         uint Tick;                                                                                //跳動(dòng)計(jì)數(shù),用于等待時(shí)間
  11.         void* event_function;                                        //事件函數(shù)指針
  12.         uchar event_return;                                                //事件返回值,用于確定喚醒任務(wù)的事件
  13.         uchar  ready;                                                                        //阻塞/就緒標(biāo)志位
  14.         uchar  priority;                                                        //優(yōu)先級(jí)
  15.         struct Task_Control_Block_List* Next;
  16. };
  17. typedef struct Task_Control_Block_List Task_List;

  18. struct Task_Priority_List{
  19.         struct Task_Priority_List * Next;
  20.         struct Task_Control_Block_List* Head_Task;
  21.         struct Task_Control_Block_List* Next_Task;
  22.         uchar  priority;
  23. }Task_Priority_List;
  24. typedef struct Task_Priority_List Task_Ready_List;


  25. static Task_List Block_List_Head;                                                //   阻塞鏈表表頭
  26. static Task_List* Now_Task;                                                                         //   目前啟用任務(wù)
  27. static Task_Ready_List Task_Ready_List_Head;// 優(yōu)先級(jí)鏈表表頭

  28. static uchar data Stack_Start;                                                        // 棧開(kāi)始
  29. static uchar data Stack_Last;                                                                // 上一個(gè)棧尾
  30. static uchar data Stack_St;                                                                        // 中間變量

  31. static uint  Tick;

  32. //事件函數(shù)返回不是0的數(shù)即代表觸發(fā)事件
  33. static uchar (*Event_Function)();

  34. static void Free_Task();
  35. static void ADD_Task_To_Priority_List(Task_List * list);
  36. static void DEC_Task_Of_Priority_List(Task_List * list);



  37. static void Timer() interrupt 1
  38. {
  39.         Task_List* Task_Now;
  40.         Task_List* Task_Now1;
  41.         EA = 0;//禁止中斷嵌套
  42.         //保存上文
  43.         Stack_Last = SP;
  44.         SP = Stack_St;
  45.         Now_Task->tail_Stack =(uchar *) Stack_Last;
  46.        
  47.        
  48.         // 搜索阻塞鏈表中達(dá)成條件的任務(wù)
  49.         for(Task_Now = &Block_List_Head; Task_Now->Next != NULL;)
  50.         {
  51.                 uchar a;
  52.                 Event_Function = Task_Now->Next->event_function;
  53.                 a = Event_Function();
  54.                 if(a || --Task_Now->Next->Tick == 0)
  55.                 {
  56.                         //將其從阻塞鏈表中移除,并添加到優(yōu)先級(jí)任務(wù)鏈表
  57.                                 Task_Now->Next->event_return = a;
  58.                                 Task_Now->Next->event_function = NULL;
  59.                                 Task_Now->Next->ready = 1;
  60.                                 Task_Now1 = Task_Now->Next;
  61.                                 Task_Now->Next = Task_Now->Next->Next;
  62.                                 ADD_Task_To_Priority_List(Task_Now1);
  63.                 }
  64.                 else
  65.                  Task_Now = Task_Now->Next;
  66.         }
  67.         Tick++;// 時(shí)鐘跳動(dòng)
  68.         //修改當(dāng)前啟用任務(wù)
  69.         Now_Task = Task_Ready_List_Head.Next->Next_Task;
  70.         //修改優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
  71.         if(Now_Task->Next != NULL)// 當(dāng)前啟用任務(wù)不是最后一個(gè)任務(wù)
  72.                 Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
  73.         else                                                                                        // 當(dāng)前啟用任務(wù)是最后一個(gè)任務(wù)
  74.                 Task_Ready_List_Head.Next->Next_Task = Task_Ready_List_Head.Next->Head_Task;
  75.        
  76.         //更換下文
  77.         Stack_Last =(uchar) Now_Task->tail_Stack;
  78.        
  79.         SP = Stack_Last;
  80.        
  81.        
  82.        
  83.        
  84.         EA = 1;
  85.        
  86. }
  87. //無(wú)事件,用于僅等待時(shí)間的任務(wù)
  88. static uchar Not_Event()
  89. {
  90.         return 0;
  91. }
  92. /*--------------------任務(wù)阻塞-------------------------
  93. Tick,任務(wù)等待超時(shí)時(shí)間,具體時(shí)間根據(jù)調(diào)度函數(shù)進(jìn)入頻率確定
  94. function, 事件函數(shù)
  95. -----------------------------------------------------*/
  96. uchar Task_Block(void* function, uint Tick)
  97. {
  98.         EA = 0;
  99.         if(function == NULL)function = Not_Event;
  100.         Now_Task->event_function     =  function;
  101.         Now_Task->event_return       =       255;
  102.         Now_Task->Tick               =      Tick;
  103.         Now_Task->ready              =         0;
  104.        
  105.         DEC_Task_Of_Priority_List(Now_Task);
  106.         Now_Task->Next = Block_List_Head.Next;
  107.         Block_List_Head.Next = Now_Task;
  108.        
  109.         EA = 1;
  110.         TF0 = 1;
  111.         return Now_Task->Next->event_return;
  112. //        for(i = 0; i < 8; i++);
  113. }
  114. //任務(wù)初始化
  115. void Task_Init()
  116. {
  117.         TMOD = 0x00;
  118.         TH0 = 0xF6;
  119.         TL0 = 0x3B;
  120.         TR0 = 1;
  121.         ET0 = 1;
  122.         Stack_Start = SP;
  123.         Stack_Start += 10;
  124.         Task_Ready_List_Head.priority  = 0;
  125.         Task_Ready_List_Head.Head_Task = NULL;
  126.         Task_Ready_List_Head.Next      = NULL;
  127.         Task_Ready_List_Head.Next_Task = NULL;
  128.         Block_List_Head.Next           = NULL;
  129.        
  130. }
  131. /*--------------添加任務(wù)------------
  132. //x, 任務(wù)頭函數(shù)
  133. //Stack_Growth, 棧生長(zhǎng)(內(nèi)部已經(jīng)加上寄存器以及函數(shù)頭所需的空間)
  134. //priority, 優(yōu)先級(jí)
  135. ------------------------------------*/
  136. void Task_ADD(uint x, uchar Stack_Growth, uchar priority)
  137. {
  138.         Task_List * list = malloc(sizeof(Task_List));// 定義任務(wù)鏈表
  139.        
  140.         list->priority = priority;                                                                        //優(yōu)先級(jí)賦值
  141.         list->head_Stack =(uchar *)Stack_Start ;    //棧頭地址賦值
  142.         ((uchar*) Stack_Start)[0] =  x % 256 ;
  143.         ((uchar*) Stack_Start)[1] =  x >>  8 ;
  144.         Stack_Start += Stack_Growth + 15;                                          //修改棧結(jié)尾位置
  145.         list->tail_Stack = &list->head_Stack[14];                //棧尾地址賦值
  146.         list->ready = 1;                                                                                                                //阻塞/就緒態(tài)賦值
  147.         list->Next = NULL;
  148.         ADD_Task_To_Priority_List(list);
  149.        
  150. }
  151. //從優(yōu)先級(jí)任務(wù)鏈中刪除一個(gè)任務(wù)
  152. static void DEC_Task_Of_Priority_List(Task_List * list)
  153. {
  154.         uchar priority = list->priority;
  155.         Task_Ready_List* priority_List;                                                               
  156.         Task_Ready_List* new_priority_List;
  157.         Task_List * list1;
  158.         //查找優(yōu)先級(jí)鏈表內(nèi)是否已有所需優(yōu)先級(jí)
  159.         for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
  160.         {
  161.                 if(priority_List->Next->priority >  priority)return;// 錯(cuò)誤, 沒(méi)有找著所需優(yōu)先級(jí)
  162.                 if(priority_List->Next->priority == priority)break;// 當(dāng)前鏈表優(yōu)先級(jí)等于所需優(yōu)先級(jí)
  163.         }
  164.         if(priority_List->Next == NULL)return;// 錯(cuò)誤, 沒(méi)有找著所需優(yōu)先級(jí)
  165.        
  166.         if(priority_List->Next->Head_Task == NULL);// 錯(cuò)誤,當(dāng)前優(yōu)先級(jí)內(nèi)沒(méi)有任務(wù)
  167.        
  168.         else if(priority_List->Next->Head_Task == list)// 判斷優(yōu)先級(jí)任務(wù)頭是不是所需任務(wù)
  169.         {
  170.                 priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務(wù)
  171.         }
  172.         //在當(dāng)前優(yōu)先級(jí)任務(wù)鏈內(nèi)搜索所需任務(wù)
  173.         else for(list1 = priority_List->Next->Head_Task; list1->Next != NULL; list1 = list1->Next)
  174.         {
  175.                 if(list1->Next == list)
  176.                 {
  177.                         list1->Next = list1->Next->Next;// 從優(yōu)先級(jí)任務(wù)鏈中刪除任務(wù)
  178.                         break;
  179.                 }
  180.         }
  181.         if(priority_List->Next->Head_Task == NULL)//當(dāng)前優(yōu)先級(jí)內(nèi)沒(méi)有任何任務(wù),刪除當(dāng)前優(yōu)先級(jí)任務(wù)鏈
  182.         {
  183.                 new_priority_List = priority_List->Next;
  184.                 priority_List->Next = priority_List->Next->Next;
  185.                 free(new_priority_List);
  186.         }
  187. }
  188. //添加一個(gè)任務(wù)到優(yōu)先級(jí)任務(wù)鏈
  189. static void ADD_Task_To_Priority_List(Task_List * list)
  190. {
  191.         uchar priority = list->priority;
  192.         Task_Ready_List* priority_List;                                                               
  193.         Task_Ready_List* new_priority_List;
  194.         //查找優(yōu)先級(jí)鏈表內(nèi)是否已有當(dāng)前優(yōu)先級(jí)
  195.         for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
  196.         {
  197.                 if(priority_List->Next->priority >  priority)goto NEWHEAD;
  198.                 if(priority_List->Next->priority == priority)break;// 當(dāng)前鏈表優(yōu)先級(jí)等于當(dāng)前優(yōu)先級(jí)
  199.         }
  200.         if(priority_List->Next == NULL)// 優(yōu)先級(jí)鏈表內(nèi)沒(méi)有當(dāng)前優(yōu)先級(jí)
  201.         {
  202.                 NEWHEAD:
  203.                 //新建一個(gè)優(yōu)先級(jí)頭
  204.                 new_priority_List = malloc(sizeof(Task_Ready_List));
  205.                 new_priority_List->Next = priority_List->Next;
  206.                 priority_List->Next = new_priority_List;
  207.                 priority_List->Next->priority = priority;
  208.                 priority_List->Next->Next_Task = list;
  209.                 priority_List->Next->Head_Task = NULL;
  210.         }
  211.         //更換優(yōu)先級(jí)鏈內(nèi)頭任務(wù)
  212.         list->Next = priority_List->Next->Head_Task;
  213.         priority_List->Next->Head_Task = list;
  214. }
  215. void Task_Start()
  216. {
  217.         Task_Ready_List* priority_List;                       
  218.         Stack_St = SP;
  219.         Task_ADD(Free_Task, 4,55);// 添加空閑任務(wù)
  220.         //設(shè)置優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
  221.         for(priority_List = Task_Ready_List_Head.Next; priority_List != NULL; priority_List = priority_List->Next)
  222.                 priority_List->Next_Task = priority_List->Head_Task;
  223.         //獲得當(dāng)前啟用任務(wù)
  224.         Now_Task = Task_Ready_List_Head.Next->Head_Task;
  225.         //修改優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
  226.         if(Now_Task->Next != NULL)// 當(dāng)前啟用任務(wù)不是最后一個(gè)任務(wù)
  227.                 Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
  228.         else                                                                                        // 當(dāng)前啟用任務(wù)是最后一個(gè)任務(wù)
  229.                 Task_Ready_List_Head.Next->Next_Task = Task_Ready_List_Head.Next->Head_Task;
  230.         // 修改棧指針指向位置
  231.         SP =(uchar) Task_Ready_List_Head.Next->Head_Task->head_Stack + 1;
  232.         EA = 1;
  233.         TF0 = 1;
  234. }

  235. static void Free_Task()
  236. {
  237.         EA = 1;
  238.         while(1)
  239.         {
  240.                 EA = 1;
  241.         }
  242. }


復(fù)制代碼

----------------------------------------------------------
調(diào)用示例

  1. void main()
  2. {
  3.         int i;
  4.         EA = 0;
  5.        
  6.         init_mempool(mem, sizeof(mem));
  7.         Task_Init();
  8.        
  9.         Task_ADD(mian, 4,2);
  10.         Task_ADD(Key_Read,12,2);
  11.         Task_ADD(Main_Dis, 16,1);
  12.        
  13.        
  14.         Task_Start();
  15. }
復(fù)制代碼

---------------------------------------------------
事件函數(shù)示例


  1. uchar Dis_event()
  2. {
  3.         return Dis_Start == 1;
  4. }
  5. //調(diào)用
  6.                 Task_Block(Dis_event, 65535);
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:564182 發(fā)表于 2020-12-21 19:19 來(lái)自觸屏版 | 只看該作者
厲害。。。。。。
回復(fù)

使用道具 舉報(bào)

5#
ID:1000179 發(fā)表于 2022-6-20 23:03 | 只看該作者
人才�。�!
回復(fù)

使用道具 舉報(bào)

6#
ID:745149 發(fā)表于 2022-6-21 20:30 | 只看該作者
大神厲害,膜拜~~
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表