找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5325|回復: 5
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
ID:776954 發(fā)表于 2020-7-28 09:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
溫馨提示:      1.該內核僅供學習和參考使用。
      2.大概率不會再更新(沒必要造輪子)。
      3.該內核并不成熟,如要使用操作系統(tǒng)請尋找市面上成熟的內核。      4.個人不喜歡大片的注釋,注釋僅僅說明大致功能,細節(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; //時間指針
  9.         uchar  event_End;                        //時間結束
  10.         uchar  ready;                                        //就緒狀態(tài)
  11.         uchar  priority;                        //優(yōu)先級
  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. //添加任務到優(yōu)先級鏈
  24. void ADD_Task_To_Priority_List(Task_List * list);
  25. //從優(yōu)先級鏈中刪除任務
  26. void DEC_Task_Of_Priority_List(Task_List * list);

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

  30. static uchar data Stack_Start;                                                        // 棧開始
  31. static uchar data Stack_Last;                                                                // 上一個棧尾
  32. static uchar data Stack_St;                                                                        // 中間變量

  33. //任務調度函數(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.         // 搜索阻塞鏈表中達成條件的任務
  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)先級任務鏈表
  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.         //修改當前啟用任務
  70.         Now_Task = Task_Ready_List_Head.Next->Next_Task;
  71.         //修改優(yōu)先級鏈表中下一個啟用任務
  72.         if(Now_Task->Next != NULL)// 當前啟用任務不是最后一個任務
  73.                 Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
  74.         else                                                                                        // 當前啟用任務是最后一個任務
  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. //任務阻塞
  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. //任務等待時間
  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. // 添加任務
  135. void Task_ADD(void * x, uchar Stack_Growth, uchar priority)
  136. {
  137.         Task_List * list = malloc(sizeof(Task_List));// 定義任務鏈表
  138.        
  139.         list->priority = priority;                                                                        //優(yōu)先級賦值
  140.         list->head_Stack =(uchar *)Stack_Start ;    //棧頭地址賦值
  141.         //將任務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;                                          //修改下一個棧開始位置
  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)先級任務鏈中刪除一個任務(將任務從就緒態(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)先級鏈表內是否已有所需優(yōu)先級
  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;// 錯誤, 沒有找著所需優(yōu)先級
  173.                 if(priority_List->Next->priority == priority)break;// 當前鏈表優(yōu)先級等于所需優(yōu)先級
  174.         }
  175.         if(priority_List->Next == NULL)return;// 錯誤, 沒有找著所需優(yōu)先級
  176.         if(priority_List->Next->Head_Task == NULL)goto ASDN;// 錯誤,當前優(yōu)先級內沒有任務
  177.        
  178.         if(priority_List->Next->Head_Task == list)// 判斷優(yōu)先級任務頭是不是所需任務
  179.         {
  180.                 priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務
  181.                 goto ASDN;
  182.         }
  183.         //在當前優(yōu)先級任務鏈內搜索所需任務
  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)先級任務鏈中刪除任務
  189.                         break;
  190.                 }
  191.         }
  192.         ASDN:
  193.         if(priority_List->Next->Head_Task == NULL)//當前優(yōu)先級內沒有任何任務,刪除當前優(yōu)先級任務鏈
  194.         {
  195.                 new_priority_List = priority_List->Next;
  196.                 priority_List->Next = priority_List->Next->Next;
  197.         //        free(new_priority_List);
  198.         }
  199. }
  200. //添加一個任務到優(yōu)先級任務鏈(將任務添加到就緒態(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)先級鏈表內是否已有當前優(yōu)先級
  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;// 當前鏈表優(yōu)先級等于當前優(yōu)先級
  211.         }
  212.         if(priority_List->Next == NULL)// 優(yōu)先級鏈表內沒有當前優(yōu)先級
  213.         {
  214.                 NEWHEAD:
  215.                 //新建一個優(yōu)先級頭
  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)先級鏈內頭任務
  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);// 添加空閑任務
  235.         //設置優(yōu)先級鏈表中下一個啟用任務
  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.         //獲得當前啟用任務
  239.         Now_Task = Task_Ready_List_Head.Next->Head_Task;
  240.         //修改優(yōu)先級鏈表中下一個啟用任務
  241.         if(Now_Task->Next != NULL)// 當前啟用任務不是最后一個任務
  242.                 Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
  243.         else                                                                                        // 當前啟用任務是最后一個任務
  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. }


復制代碼


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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


  4. /*------任務TCB結構體-------
  5. //提示:任務棧內不包括局部變量
  6. ----------------------------*/
  7. struct Task_Control_Block_List{
  8.         uchar* head_Stack;                                                //任務棧頭
  9.         uchar* tail_Stack;                                                //任務棧尾
  10.         uint Tick;                                                                                //跳動計數(shù),用于等待時間
  11.         void* event_function;                                        //事件函數(shù)指針
  12.         uchar event_return;                                                //事件返回值,用于確定喚醒任務的事件
  13.         uchar  ready;                                                                        //阻塞/就緒標志位
  14.         uchar  priority;                                                        //優(yōu)先級
  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;                                                                         //   目前啟用任務
  27. static Task_Ready_List Task_Ready_List_Head;// 優(yōu)先級鏈表表頭

  28. static uchar data Stack_Start;                                                        // 棧開始
  29. static uchar data Stack_Last;                                                                // 上一個棧尾
  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.         // 搜索阻塞鏈表中達成條件的任務
  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)先級任務鏈表
  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++;// 時鐘跳動
  68.         //修改當前啟用任務
  69.         Now_Task = Task_Ready_List_Head.Next->Next_Task;
  70.         //修改優(yōu)先級鏈表中下一個啟用任務
  71.         if(Now_Task->Next != NULL)// 當前啟用任務不是最后一個任務
  72.                 Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
  73.         else                                                                                        // 當前啟用任務是最后一個任務
  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. //無事件,用于僅等待時間的任務
  88. static uchar Not_Event()
  89. {
  90.         return 0;
  91. }
  92. /*--------------------任務阻塞-------------------------
  93. Tick,任務等待超時時間,具體時間根據(jù)調度函數(shù)進入頻率確定
  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. //任務初始化
  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. /*--------------添加任務------------
  132. //x, 任務頭函數(shù)
  133. //Stack_Growth, 棧生長(內部已經(jīng)加上寄存器以及函數(shù)頭所需的空間)
  134. //priority, 優(yōu)先級
  135. ------------------------------------*/
  136. void Task_ADD(uint x, uchar Stack_Growth, uchar priority)
  137. {
  138.         Task_List * list = malloc(sizeof(Task_List));// 定義任務鏈表
  139.        
  140.         list->priority = priority;                                                                        //優(yōu)先級賦值
  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;                                          //修改棧結尾位置
  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)先級任務鏈中刪除一個任務
  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)先級鏈表內是否已有所需優(yōu)先級
  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;// 錯誤, 沒有找著所需優(yōu)先級
  162.                 if(priority_List->Next->priority == priority)break;// 當前鏈表優(yōu)先級等于所需優(yōu)先級
  163.         }
  164.         if(priority_List->Next == NULL)return;// 錯誤, 沒有找著所需優(yōu)先級
  165.        
  166.         if(priority_List->Next->Head_Task == NULL);// 錯誤,當前優(yōu)先級內沒有任務
  167.        
  168.         else if(priority_List->Next->Head_Task == list)// 判斷優(yōu)先級任務頭是不是所需任務
  169.         {
  170.                 priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務
  171.         }
  172.         //在當前優(yōu)先級任務鏈內搜索所需任務
  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)先級任務鏈中刪除任務
  178.                         break;
  179.                 }
  180.         }
  181.         if(priority_List->Next->Head_Task == NULL)//當前優(yōu)先級內沒有任何任務,刪除當前優(yōu)先級任務鏈
  182.         {
  183.                 new_priority_List = priority_List->Next;
  184.                 priority_List->Next = priority_List->Next->Next;
  185.                 free(new_priority_List);
  186.         }
  187. }
  188. //添加一個任務到優(yōu)先級任務鏈
  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)先級鏈表內是否已有當前優(yōu)先級
  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;// 當前鏈表優(yōu)先級等于當前優(yōu)先級
  199.         }
  200.         if(priority_List->Next == NULL)// 優(yōu)先級鏈表內沒有當前優(yōu)先級
  201.         {
  202.                 NEWHEAD:
  203.                 //新建一個優(yōu)先級頭
  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)先級鏈內頭任務
  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);// 添加空閑任務
  220.         //設置優(yōu)先級鏈表中下一個啟用任務
  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.         //獲得當前啟用任務
  224.         Now_Task = Task_Ready_List_Head.Next->Head_Task;
  225.         //修改優(yōu)先級鏈表中下一個啟用任務
  226.         if(Now_Task->Next != NULL)// 當前啟用任務不是最后一個任務
  227.                 Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
  228.         else                                                                                        // 當前啟用任務是最后一個任務
  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. }


復制代碼

----------------------------------------------------------
調用示例

  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. }
復制代碼

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


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

評分

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

查看全部評分

回復

使用道具 舉報

地板
ID:564182 發(fā)表于 2020-12-21 19:19 來自手機 | 只看該作者
厲害。。。。。。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表