久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

自己摸了一個操作系統內核,發出來給大家看看。

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

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

  33. //任務調度函數
  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.                         //將其從阻塞鏈表中移除,并添加到優先級任務鏈表
  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.         //修改優先級鏈表中下一個啟用任務
  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;                                                                        //優先級賦值
  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;                                                                                                                //阻塞/就緒態賦值
  158.         list->Next = NULL;
  159.         ADD_Task_To_Priority_List(list);
  160.        
  161. }
  162. //從優先級任務鏈中刪除一個任務(將任務從就緒態中移除)
  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.         //查找優先級鏈表內是否已有所需優先級
  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;// 錯誤, 沒有找著所需優先級
  173.                 if(priority_List->Next->priority == priority)break;// 當前鏈表優先級等于所需優先級
  174.         }
  175.         if(priority_List->Next == NULL)return;// 錯誤, 沒有找著所需優先級
  176.         if(priority_List->Next->Head_Task == NULL)goto ASDN;// 錯誤,當前優先級內沒有任務
  177.        
  178.         if(priority_List->Next->Head_Task == list)// 判斷優先級任務頭是不是所需任務
  179.         {
  180.                 priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務
  181.                 goto ASDN;
  182.         }
  183.         //在當前優先級任務鏈內搜索所需任務
  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;// 從優先級任務鏈中刪除任務
  189.                         break;
  190.                 }
  191.         }
  192.         ASDN:
  193.         if(priority_List->Next->Head_Task == NULL)//當前優先級內沒有任何任務,刪除當前優先級任務鏈
  194.         {
  195.                 new_priority_List = priority_List->Next;
  196.                 priority_List->Next = priority_List->Next->Next;
  197.         //        free(new_priority_List);
  198.         }
  199. }
  200. //添加一個任務到優先級任務鏈(將任務添加到就緒態)
  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.         //查找優先級鏈表內是否已有當前優先級
  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;// 當前鏈表優先級等于當前優先級
  211.         }
  212.         if(priority_List->Next == NULL)// 優先級鏈表內沒有當前優先級
  213.         {
  214.                 NEWHEAD:
  215.                 //新建一個優先級頭
  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.         //更換優先級鏈內頭任務
  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.         //設置優先級鏈表中下一個啟用任務
  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.         //修改優先級鏈表中下一個啟用任務
  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. //空閑函數
  265. void Free_Task()
  266. {
  267.         while(1)
  268.         {
  269.                 EA = 1;
  270.         }
  271. }


復制代碼


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:776954 發表于 2020-8-11 15:21 | 只看該作者
更新:
1.刪除了所有匯編內容。
2.新增事件喚醒函數,現在可以方便的設計喚醒條件,并且可以知曉是由什么喚醒的任務。
-----------------------------------------------------------------------------------------------------------
  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;                                                                                //跳動計數,用于等待時間
  11.         void* event_function;                                        //事件函數指針
  12.         uchar event_return;                                                //事件返回值,用于確定喚醒任務的事件
  13.         uchar  ready;                                                                        //阻塞/就緒標志位
  14.         uchar  priority;                                                        //優先級
  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;// 優先級鏈表表頭

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

  31. static uint  Tick;

  32. //事件函數返回不是0的數即代表觸發事件
  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.                         //將其從阻塞鏈表中移除,并添加到優先級任務鏈表
  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.         //修改優先級鏈表中下一個啟用任務
  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,任務等待超時時間,具體時間根據調度函數進入頻率確定
  94. function, 事件函數
  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, 任務頭函數
  133. //Stack_Growth, 棧生長(內部已經加上寄存器以及函數頭所需的空間)
  134. //priority, 優先級
  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;                                                                        //優先級賦值
  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;                                                                                                                //阻塞/就緒態賦值
  147.         list->Next = NULL;
  148.         ADD_Task_To_Priority_List(list);
  149.        
  150. }
  151. //從優先級任務鏈中刪除一個任務
  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.         //查找優先級鏈表內是否已有所需優先級
  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;// 錯誤, 沒有找著所需優先級
  162.                 if(priority_List->Next->priority == priority)break;// 當前鏈表優先級等于所需優先級
  163.         }
  164.         if(priority_List->Next == NULL)return;// 錯誤, 沒有找著所需優先級
  165.        
  166.         if(priority_List->Next->Head_Task == NULL);// 錯誤,當前優先級內沒有任務
  167.        
  168.         else if(priority_List->Next->Head_Task == list)// 判斷優先級任務頭是不是所需任務
  169.         {
  170.                 priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務
  171.         }
  172.         //在當前優先級任務鏈內搜索所需任務
  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;// 從優先級任務鏈中刪除任務
  178.                         break;
  179.                 }
  180.         }
  181.         if(priority_List->Next->Head_Task == NULL)//當前優先級內沒有任何任務,刪除當前優先級任務鏈
  182.         {
  183.                 new_priority_List = priority_List->Next;
  184.                 priority_List->Next = priority_List->Next->Next;
  185.                 free(new_priority_List);
  186.         }
  187. }
  188. //添加一個任務到優先級任務鏈
  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.         //查找優先級鏈表內是否已有當前優先級
  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;// 當前鏈表優先級等于當前優先級
  199.         }
  200.         if(priority_List->Next == NULL)// 優先級鏈表內沒有當前優先級
  201.         {
  202.                 NEWHEAD:
  203.                 //新建一個優先級頭
  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.         //更換優先級鏈內頭任務
  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.         //設置優先級鏈表中下一個啟用任務
  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.         //修改優先級鏈表中下一個啟用任務
  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. }
復制代碼

---------------------------------------------------
事件函數示例


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

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线色视频 | 欧美黄色片 | av色站 | 国产成人啪免费观看软件 | 亚洲高清视频在线观看 | 毛片一区| 亚洲精品一区中文字幕乱码 | 日韩小视频 | 国产亚洲欧美日韩精品一区二区三区 | 久久999| 国产欧美在线 | 国产伦精品一区二区三区精品视频 | 不卡一二三区 | japan21xxxxhd美女| 三级成人片| 欧美极品少妇xxxxⅹ免费视频 | 成人a视频在线观看 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 精品国产91乱码一区二区三区 | www久久99 | 精品久久香蕉国产线看观看亚洲 | 国产高清自拍视频在线观看 | 美女视频一区二区三区 | 99精品久久久国产一区二区三 | 国产精品久久久久久久久久久久久 | 国产成视频在线观看 | 午夜爽爽爽男女免费观看 | 国产成人精品一区二区三区在线 | 九九热免费在线观看 | 精品久久久久国产免费第一页 | 国产在线精品一区二区 | 在线观看中文字幕 | 亚洲一区二区网站 | 国产成人精品一区二 | 成人午夜免费福利视频 | 在线观看第一区 | 欧美视频xxx | 欧美一区二区三区在线观看视频 | 激情五月婷婷丁香 | 日韩www视频| 精品中文字幕久久 |