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

標題: 自己摸了一個操作系統內核,發出來給大家看看。 [打印本頁]

作者: Hui_Min    時間: 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. }


復制代碼



作者: hzn1990    時間: 2020-8-5 16:28
可以的,在完善一下。
作者: Hui_Min    時間: 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);
復制代碼

作者: hzn1990    時間: 2020-12-21 19:19
厲害。。。。。。
作者: 安華    時間: 2022-6-20 23:03
人才!!!
作者: fumky    時間: 2022-6-21 20:30
大神厲害,膜拜~~




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 91在线看片 | 日日夜夜精品视频 | 男人天堂av网站 | 日韩电影一区 | 国产亚洲网站 | 国产91丝袜在线18 | 亚洲精品黄色 | 午夜爽爽爽男女免费观看 | 色精品视频 | 午夜三区 | 91成人免费看 | 欧美在线激情 | 日韩免费中文字幕 | 日本三级全黄三级a | 一级欧美| 国产资源一区二区三区 | 成人午夜黄色 | 中文视频在线 | 欧美精品一区二区三区在线播放 | 欧美伊人久久久久久久久影院 | 亚洲日韩中文字幕一区 | 亚洲欧洲成人 | 亚洲视频在线看 | 九九久久这里只有精品 | 精品一区二区在线看 | 国产综合精品一区二区三区 | 精品国模一区二区三区欧美 | 伊人久久综合影院 | 国产一级视频在线播放 | 999re5这里只有精品 | 琪琪午夜伦伦电影福利片 | 国产精品夜间视频香蕉 | 欧美日本一区 | 欧美一级片在线 | 在线天堂免费中文字幕视频 | 亚洲精品68久久久一区 | 中文字字幕一区二区三区四区五区 | 亚洲区一区二 | 国产精品久久久久久影院8一贰佰 | 欧美精品在线一区 | 欧美区日韩区 |