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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

小小調度器問星整理版[可設置選擇8/16/32位] 極小資源MCU操作系統

  [復制鏈接]
跳轉到指定樓層
樓主
ID:97470 發表于 2020-7-3 10:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在原作者smset基礎上增加1、可以在宏定義里選擇8位 16位還是32位2、定義任務用TASK開頭
  1. //  任務0 任務定義以TASK開頭
  2. TASK task0(){
  3. _SS
  4.   while(1){
  5.    WaitX(50);
  6.    LED0=!LED0;   
  7.   }
  8. _EE
  9. }
復制代碼

3、增加實時性更高的等待某條件定義。
4、更多詳細信息請參考附件內容。


最近修改記錄:

2020-07-03
  1、增加 普通函數無阻塞延時開關宏定義,方便在不使用普通函數無阻塞延時功能時減少RAM占用和更新任務的時間:
      NORMALDELAY  默認為0關閉,修改為1則打開
  
  2020-04-17
   1、同步smset的小小調度器1.11(16位定時器版),新增的等待某個條件或超時溢出
       WaitUtilT(A,TimeOut)
   2、在smset的WaitUtilT(A,TimeOut)基礎上,增加等待某個條件為某個值或超時溢出
       WAITUNTILT(A,VAL,TimeOut)
  
  2019-05-30
  1、增加等待某個條件為某個值或超時溢出
      A條件變量;VAL條件值;TaskVAL超時值,不能為0,和TaskVAL的位數調度器定義的位數一樣;ONLY超時判斷唯一序號
      WAITUNTILO(A,VAL,TaskVAL,ONLY)
      每增加一個超時判斷會增加一個調度器位數對應內存占用
  2、添加 void runTasks(void); 聲明,確保部分編譯器不會報錯
  
  2019-05-29
   1、整合群主semet的普通函數無阻塞延時
   2、添加變量位數類型定義,方便根據編譯器環境定義修改
   注意:無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數使用


全部資料51hei下載地址:
小小調度器1.1.6問星整理版.zip (2.95 KB, 下載次數: 43)

  1. #ifndef __xxddq_H
  2. #define __xxddq_H
  3. /*
  4. * @Project      : 小小調度器問星整理版
  5. * @Descripttion : 可設置選擇8/16/32版本,在原來的基礎上進一步增強
  6. * @version      : 1.1.6 maintask版
  7. * @Author       : smset
  8. * @Date         : 2015-06-02 09:02:31
  9. * @LastEditors  : 問星
  10. * @LastEditTime : 2020-07-03 09:54:57
  11. * @History      :
  12. * 2020-07-03
  13. * 1、增加 普通函數無阻塞延時開關宏定義,方便在不使用普通函數無阻塞延時功能時減少RAM占用和更新任務的時間:
  14. *     NORMALDELAY  默認為0關閉,修改為1則打開
  15. *
  16. * 2020-04-17
  17. *  1、同步smset的小小調度器1.11(16位定時器版),新增的等待某個條件或超時溢出
  18. *      WaitUtilT(A,TimeOut)
  19. *  2、在smset的WaitUtilT(A,TimeOut)基礎上,增加等待某個條件為某個值或超時溢出
  20. *      WAITUNTILT(A,VAL,TimeOut)
  21. *
  22. * 2019-05-30
  23. * 1、增加等待某個條件為某個值或超時溢出
  24. *     A條件變量;VAL條件值;TaskVAL超時值,不能為0,和TaskVAL的位數調度器定義的位數一樣;ONLY超時判斷唯一序號
  25. *     WAITUNTILO(A,VAL,TaskVAL,ONLY)
  26. *     每增加一個超時判斷會增加一個調度器位數對應內存占用
  27. * 2、添加 void runTasks(void); 聲明,確保部分編譯器不會報錯
  28. *
  29. * 2019-05-29
  30. *  1、整合群主semet的普通函數無阻塞延時
  31. *  2、添加變量位數類型定義,方便根據編譯器環境定義修改
  32. *  注意:無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數使用
  33. */

  34. /****小小調度器開始********************************************/
  35. //可根據編譯器環境修改定義變量位數類型,如果出現重復定義錯誤提示,可以注釋掉變量類型定義
  36. #define U8 unsigned char        //8位變量類型定義
  37. #define U16 unsigned int        //16位變量類型定義
  38. #define U32 unsigned long        //32位變量類型定義

  39. #define MAXTASKS 2          //定義調度器主任務數:1-255
  40. #define BITS 8             //定義調度器位數可選值:8/16/32
  41. #define NORMALDELAY 0       //普通函數無阻塞延時開關:0=關;1=開
  42. #define SEM U16                            //信號量定義宏

  43. #if (BITS==8)
  44. #define TASK U8
  45. #define TICKET_MAX 0xFF
  46. #endif

  47. #if (BITS==16)
  48. #define TASK U16
  49. #define TICKET_MAX 0xFFFF
  50. #endif

  51. #if (BITS==32)
  52. #define TASK U32
  53. #define TICKET_MAX 0xFFFFFFFF
  54. #endif

  55. volatile TASK timers[MAXTASKS];
  56. #if (NORMALDELAY==1)
  57. volatile TASK delaycount;
  58. #endif
  59. void runTasks(void);

  60. //任務頭
  61. #define _SS static U8 _lc=0; switch(_lc){default:

  62. //任務尾
  63. #define _EE ;}; _lc=0; return TICKET_MAX;

  64. //等待X個時鐘周期
  65. #define WaitX(tickets)  do { _lc=(__LINE__%255)+1; return (tickets) ;case (__LINE__%255)+1:;} while(0);

  66. //等待某個條件
  67. #define WaitUntil(A)    do { while(!(A)) WaitX(1);} while(0);

  68. //等待某個條件為某個值        A條件變量;VAL條件值
  69. #define WAITUNTIL(A,VAL)  do { WaitX(1);} while((A)!=VAL);

  70. //等待某個條件或超時溢出
  71. #define WaitUtilT(A,TimeOut)  do {static TASK _count=(TimeOut); do { WaitX(1); _count--; } while((!(A))&&(_count>0));} while(0);

  72. //等待某個條件為某個值或超時溢出
  73. #define WAITUNTILT(A,VAL,TimeOut)  do {static TASK _count=(TimeOut); do { WaitX(1); _count--; } while(((A)!=VAL)&&(_count>0));} while(0);

  74. //等待某個條件為某個值或超時溢出        A條件變量;VAL條件值;TaskVAL超時值,不能為0,和TaskVAL的位數調度器定義的位數一樣;ONLY超時判斷唯一序號
  75. #define WAITUNTILO(A,VAL,TaskVAL,ONLY)  do {static TASK A##ONLY;A##ONLY=TaskVAL;do {WaitX(1);A##ONLY--;} while((A)!=VAL && A##ONLY!=0);}while(0);

  76. //只能用在RunTask調用的任務里 實時性更高 等待某個條件
  77. #define WaitUntilR(A)    do { while(!(A)) WaitX(0);} while(0);

  78. //只能用在RunTask調用的任務里 實時性更高 等待某個條件為某個值        A條件變量;VAL條件值
  79. #define WAITUNTILR(A,VAL)  do { WaitX(0);} while((A)!=VAL);

  80. //只能用在RunTask調用的任務里 實時性更高 等待某個條件或超時溢出
  81. #define WaitUtilTR(A,TimeOut)  do {static TASK _count=(TimeOut); do { WaitX(0); _count--; } while((!(A))&&(_count>0));} while(0);

  82. //只能用在RunTask調用的任務里 實時性更高 等待某個條件為某個值或超時溢出
  83. #define WAITUNTILTR(A,VAL,TimeOut)  do {static TASK _count=(TimeOut); do { WaitX(0); _count--; } while(((A)!=VAL)&&(_count>0));} while(0);

  84. //運行任務
  85. #define RunTask(TaskName,TaskID)  do { if (timers[TaskID]==0) { TASK d=TaskName(); while(timers[TaskID]!=d) timers[TaskID]=d;} } while(0);

  86. //運行任務,前面的任務優先保證執行
  87. #define RunTaskA(TaskName,TaskID) do { if (timers[TaskID]==0) {TASK d=TaskName(); while(timers[TaskID]!=d) timers[TaskID]=d;continue;} } while(0);

  88. //調用子任務
  89. #define CallSub(SubTaskName) do {TASK currdt; _lc=(__LINE__%255)+1; return 0; case (__LINE__%255)+1:  currdt=SubTaskName(); if(currdt!=TICKET_MAX) return currdt;} while(0);

  90. //調用子任務,傳入一個參數,傳入的參數需在釋放CPU前使用
  91. #define CallSub1(SubTaskName,p1) do {TASK currdt; _lc=(__LINE__%255)+1; return 0; case (__LINE__%255)+1:  currdt=SubTaskName(p1); if(currdt!=TICKET_MAX) return currdt;} while(0);

  92. //調用子任務,傳入二個參數,傳入的參數需在釋放CPU前使用
  93. #define CallSub2(SubTaskName,p1,p2) do {TASK currdt; _lc=(__LINE__%255)+1; return 0; case (__LINE__%255)+1:  currdt=SubTaskName(p1,p2); if(currdt!=TICKET_MAX) return currdt;} while(0);

  94. //初始化任務調度
  95. #define InitTasks() do {U8 i; for(i=MAXTASKS;i>0 ;i--) timers[i-1]=0; } while(0);

  96. #if (NORMALDELAY==0)
  97. //更新任務
  98. #define UpdateTimers() do{U8 i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=TICKET_MAX)) timers[i-1]--;}} while(0);
  99. #endif

  100. #if (NORMALDELAY==1)
  101. //更新任務
  102. #define UpdateTimers() do{U8 i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=TICKET_MAX)) timers[i-1]--;} if(delaycount>0) delaycount--;} while(0);

  103. //普通函數無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數 使用
  104. #define DELAYX(tickets) do{delaycount=tickets;while(delaycount>0) {runTasks();}}while(0);
  105. #endif

  106. //初始化信號量
  107. #define InitSem(sem) do{sem=0;}while(0);

  108. //等待信號量
  109. #define WaitSem(sem) do{ sem=1; WaitX(0); if (sem>0) return 1;} while(0);

  110. //發送信號量
  111. #define SendSem(sem)  do {sem=0;} while(0);

  112. //等待信號量或定時器溢出
  113. #define WaitSemX(sem, tickets) do{sem=tickets+1;WaitX(0);if(sem>1){sem--;return 1;}}while (0);

  114. /*****小小調度器結束*******************************************************/

  115. /*****調用示例*************************************************
  116. #include "xxddq.h"

  117. sbit LED1 = P2^1;
  118. sbit LED2 = P2^2;
  119. sbit LED0 = P2^5;

  120. //  任務0 任務定義以TASK開頭
  121. TASK task0(){
  122. _SS
  123.   while(1){
  124.    WaitX(50);
  125.    LED0=!LED0;   
  126.   }
  127. _EE
  128. }
  129. //  任務1 任務定義以TASK開頭
  130. TASK task1(){
  131. _SS
  132.   while(1){
  133.   // WaitX(100);
  134.   // LED1=!LED1;
  135.   test1();  
  136.   }
  137. _EE
  138. }
  139. //  任務2 任務定義以TASK開頭
  140. TASK task2(){
  141. _SS
  142.     while(1){
  143.         WaitX(100);
  144.         LED2=!LED2;   
  145.     }
  146. _EE
  147. }

  148. //  TIME0初始化
  149. void InitT0()
  150. {
  151.     TMOD = 0x21;
  152.     IE |= 0x82;  // 12t
  153.     TL0=0Xff;
  154.     TH0=0XDB;
  155.     TR0 = 1;
  156. }
  157. //  TIM0中斷服務
  158. void INTT0(void) interrupt 1 using 1
  159. {
  160.     TL0=0Xff;           //10ms 重裝
  161.     TH0=0XDB;           //b7;   
  162.     UpdateTimers();     //更新任務
  163.     RunTask(task0,0);   //任務0具有精確按時獲得執行的權限,要求:task0每次執行消耗時間<0.5個 ticket
  164. }

  165. //無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數 使用
  166. //TASK i 定義參數確保參數位數和調度器內定義的位數一樣
  167. void delayx(TASK i){
  168.       DELAYX(i);        //普通函數無阻塞延時
  169. }

  170. //普通函數
  171. void test1(){
  172.      delayx(50);
  173.      LED0=1;

  174.      delayx(50);
  175.      LED0=0;

  176.      delayx(50);
  177.      LED0=1;

  178.      delayx(50);
  179.      LED0=0;
  180. }

  181. //主任務 主任務函數名必須為 runTasks
  182. void runTasks()
  183. {
  184. //        RunTask(task0,0);
  185.     RunTaskA(task1,1);//任務1具有比任務2高的運行權限                  
  186.     RunTaskA(task2,2);//任務2具有低的運行權限
  187. }

  188. //  主循環
  189. void main()
  190. {
  191.     InitT0();
  192.     InitTasks(); //初始化任務,實際上是給timers清零
  193.    
  194.         //主循環或主循環內的函數或主循環函數調用的子函數里,必須有一個無阻塞延時函數執行
  195.     while(1){
  196.     //  delayx(1);        //無阻塞延時1個任務時鐘
  197.         test1();        //調用了無阻塞延時函數的普通函數
  198.     //        runTasks();        //沒有普通函數調用無阻塞延時函數時,可以只調用主任務
  199.     }
  200. }
  201. **************************************************************/
  202. #endif
復制代碼


評分

參與人數 2黑幣 +62 收起 理由
jzbas + 12 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:97470 發表于 2020-10-25 14:15 | 只看該作者
2020-10-15
  1、整合SETJMP版.可通過定義SETJMP切換
     #define SETJMP 0            //版本選擇:0=SWINCH版 1=SETJMP版

  2020-10-14
  1、增加LCBIT宏定義來設置_lc變量類型.
          #define LCBIT 0                        //選擇_lc的變量類型: 0=8位;1=16位.
          PICC高版本編譯器宏不支持__LINE__%255運算,LCBIT定義需設置為1。代價就是每個任務多占一個字節的RAM.
     其它編譯器如果不報錯,建議 LCBIT 設置為0,和原來一樣.

小小調度器1.2.0問星整理版.rar (3.32 KB, 下載次數: 18)


評分

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

查看全部評分

回復

使用道具 舉報

板凳
ID:328014 發表于 2020-10-26 03:13 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

地板
ID:97470 發表于 2020-11-4 14:01 | 只看該作者
重要更新!!!
2020-11-04
  1、修復超時判斷只能生效1次的BUG(群友"上善若水"發現)
     在WaitUtilT(A,TimeOut)、WAITUNTILT(A,VAL,TimeOut)、WaitUtilTR(A,TimeOut)、WAITUNTILTR(A,VAL,TimeOut)定義里增加”_count=TimeOut;“


小小調度器1.2.1問星整理版.rar (3.64 KB, 下載次數: 21)

回復

使用道具 舉報

5#
ID:429830 發表于 2020-12-14 00:52 | 只看該作者
贊贊贊
回復

使用道具 舉報

6#
ID:97470 發表于 2020-12-14 10:10 | 只看該作者
2020-11-06
    1、增加 #define WAITUTILTRTYPE 0         //WaitUtilTR 超時等待判斷類型選擇宏
        0=簡單,WaitUtilTR(A,TimeOut,TINDEX) TINDEX:超時等待索引只能0-7,每個WaitUtilTR的索引不能重復,只支持8個實時性高的超時判斷;
        1=靈活 自定義變量,WaitUtilTR(A,TimeOut,T1FLAY) T1FLAY:1個調度器時鐘周期標志變量,需在調度器時鐘周期定時器中斷里將變量置1。
        簡單調用示例:WaitUtilTR(f.b0,2,0);

2020-11-05
    1、修改“_count”賦初值的位置,使之理合理
    2、修改“WaitUtilTR(A,TimeOut)、WAITUNTILTR(A,VAL,TimeOut)”定義,解決實時性高的判斷等待超時時間不準的問題
        增加“T1FLAY”一個調度器周期標志變量參數,變為“WaitUtilTR(A,TimeOut,T1FLAY)、WAITUNTILTR(A,VAL,TimeOut,T1FLAY)”
        使用方式請參考例子
小小調度器1.2.3問星整理版.rar (5.06 KB, 下載次數: 50)

回復

使用道具 舉報

7#
ID:230847 發表于 2020-12-27 10:25 | 只看該作者
謝謝樓主,這個不錯。能看懂,期待更新。
回復

使用道具 舉報

8#
ID:230847 發表于 2020-12-28 09:18 | 只看該作者
編譯后出現test.c(99): warning C294: unreachable code。這個怎么消除呢?
回復

使用道具 舉報

9#
ID:814329 發表于 2021-1-9 11:29 | 只看該作者
支持,下載詳細學習一下
回復

使用道具 舉報

10#
ID:814329 發表于 2021-1-9 11:35 | 只看該作者
有簡單的應用指導說明和具體應用的實例介紹嗎?三個LED,三個任務,不能充分說明系統真正的實用價值。
回復

使用道具 舉報

11#
ID:219078 發表于 2021-4-8 14:19 | 只看該作者
贊個,后續還有更新嗎?準備試試看
回復

使用道具 舉報

12#
ID:807361 發表于 2023-6-24 22:13 | 只看該作者
這個小小調度器現在更新到哪個版本了??
回復

使用道具 舉報

13#
ID:899151 發表于 2025-1-24 10:35 | 只看該作者
感謝分享,這個比較好 1.2.3加入了setjmp
回復

使用道具 舉報

14#
ID:1101997 發表于 2025-1-25 12:15 | 只看該作者
51用OS做的看來還是少啊,關心的人不多,其實項目大還是這個方便
回復

使用道具 舉報

15#
ID:338503 發表于 2025-1-25 14:18 | 只看該作者
51用OS做我還沒做過,下載下來有空研究一下,后期有大項目用這個比較方便好。非常感謝 xyb851。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区不卡视频 | 国产福利91精品 | 久久久久久久久国产精品 | 国产999精品久久久 午夜天堂精品久久久久 | 亚洲人成人一区二区在线观看 | 国产精品揄拍一区二区久久国内亚洲精 | 久久久久国产精品 | 日本一区二区高清不卡 | 色视频在线播放 | 福利片在线观看 | 久久国产精品72免费观看 | 亚洲巨乳自拍在线视频 | 亚洲美女在线视频 | 国产精品久久久久久亚洲调教 | 久久精品二区 | 欧洲精品视频一区 | 狼人伊人影院 | 国产亚洲欧美在线 | 中文字幕免费 | 91大神在线资源观看无广告 | 日韩av免费在线观看 | 一区二区三区视频在线免费观看 | caoporn国产精品免费公开 | 久久蜜桃av一区二区天堂 | 亚洲风情在线观看 | 精品国产乱码久久久久久a丨 | 中文字幕国产精品 | 午夜免费视频观看 | 操操日| 久久久蜜桃一区二区人 | 亚洲 成人 av | 一区二区免费看 | 欧美在线日韩 | 国内精品久久久久久久 | 91精品一区二区三区久久久久 | 国产精品永久久久久久久www | 亚洲成人在线网 | 91精品国产91久久久久游泳池 | 国产乱xxav | 国产精品视频在线播放 | 欧美在线观看黄色 |