找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5440|回復: 14
打印 上一主題 下一主題
收起左側(cè)

小小調(diào)度器問星整理版[可設(shè)置選擇8/16/32位] 極小資源MCU操作系統(tǒng)

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

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


最近修改記錄:

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


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

  1. #ifndef __xxddq_H
  2. #define __xxddq_H
  3. /*
  4. * @Project      : 小小調(diào)度器問星整理版
  5. * @Descripttion : 可設(shè)置選擇8/16/32版本,在原來的基礎(chǔ)上進一步增強
  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、增加 普通函數(shù)無阻塞延時開關(guān)宏定義,方便在不使用普通函數(shù)無阻塞延時功能時減少RAM占用和更新任務(wù)的時間:
  14. *     NORMALDELAY  默認為0關(guān)閉,修改為1則打開
  15. *
  16. * 2020-04-17
  17. *  1、同步smset的小小調(diào)度器1.11(16位定時器版),新增的等待某個條件或超時溢出
  18. *      WaitUtilT(A,TimeOut)
  19. *  2、在smset的WaitUtilT(A,TimeOut)基礎(chǔ)上,增加等待某個條件為某個值或超時溢出
  20. *      WAITUNTILT(A,VAL,TimeOut)
  21. *
  22. * 2019-05-30
  23. * 1、增加等待某個條件為某個值或超時溢出
  24. *     A條件變量;VAL條件值;TaskVAL超時值,不能為0,和TaskVAL的位數(shù)調(diào)度器定義的位數(shù)一樣;ONLY超時判斷唯一序號
  25. *     WAITUNTILO(A,VAL,TaskVAL,ONLY)
  26. *     每增加一個超時判斷會增加一個調(diào)度器位數(shù)對應(yīng)內(nèi)存占用
  27. * 2、添加 void runTasks(void); 聲明,確保部分編譯器不會報錯
  28. *
  29. * 2019-05-29
  30. *  1、整合群主semet的普通函數(shù)無阻塞延時
  31. *  2、添加變量位數(shù)類型定義,方便根據(jù)編譯器環(huán)境定義修改
  32. *  注意:無阻塞延時 只能被主任務(wù),以及主任務(wù)調(diào)用的函數(shù),及主任務(wù)調(diào)用的函數(shù)調(diào)用的函數(shù)使用
  33. */

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

  39. #define MAXTASKS 2          //定義調(diào)度器主任務(wù)數(shù):1-255
  40. #define BITS 8             //定義調(diào)度器位數(shù)可選值:8/16/32
  41. #define NORMALDELAY 0       //普通函數(shù)無阻塞延時開關(guān):0=關(guān);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. //任務(wù)頭
  61. #define _SS static U8 _lc=0; switch(_lc){default:

  62. //任務(wù)尾
  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的位數(shù)調(diào)度器定義的位數(shù)一樣;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調(diào)用的任務(wù)里 實時性更高 等待某個條件
  77. #define WaitUntilR(A)    do { while(!(A)) WaitX(0);} while(0);

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

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

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

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

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

  88. //調(diào)用子任務(wù)
  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. //調(diào)用子任務(wù),傳入一個參數(shù),傳入的參數(shù)需在釋放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. //調(diào)用子任務(wù),傳入二個參數(shù),傳入的參數(shù)需在釋放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. //初始化任務(wù)調(diào)度
  95. #define InitTasks() do {U8 i; for(i=MAXTASKS;i>0 ;i--) timers[i-1]=0; } while(0);

  96. #if (NORMALDELAY==0)
  97. //更新任務(wù)
  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. //更新任務(wù)
  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. //普通函數(shù)無阻塞延時 只能被主任務(wù),以及主任務(wù)調(diào)用的函數(shù),及主任務(wù)調(diào)用的函數(shù)調(diào)用的函數(shù) 使用
  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. //發(fā)送信號量
  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. /*****小小調(diào)度器結(jié)束*******************************************************/

  115. /*****調(diào)用示例*************************************************
  116. #include "xxddq.h"

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

  120. //  任務(wù)0 任務(wù)定義以TASK開頭
  121. TASK task0(){
  122. _SS
  123.   while(1){
  124.    WaitX(50);
  125.    LED0=!LED0;   
  126.   }
  127. _EE
  128. }
  129. //  任務(wù)1 任務(wù)定義以TASK開頭
  130. TASK task1(){
  131. _SS
  132.   while(1){
  133.   // WaitX(100);
  134.   // LED1=!LED1;
  135.   test1();  
  136.   }
  137. _EE
  138. }
  139. //  任務(wù)2 任務(wù)定義以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中斷服務(wù)
  158. void INTT0(void) interrupt 1 using 1
  159. {
  160.     TL0=0Xff;           //10ms 重裝
  161.     TH0=0XDB;           //b7;   
  162.     UpdateTimers();     //更新任務(wù)
  163.     RunTask(task0,0);   //任務(wù)0具有精確按時獲得執(zhí)行的權(quán)限,要求:task0每次執(zhí)行消耗時間<0.5個 ticket
  164. }

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

  170. //普通函數(shù)
  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. //主任務(wù) 主任務(wù)函數(shù)名必須為 runTasks
  182. void runTasks()
  183. {
  184. //        RunTask(task0,0);
  185.     RunTaskA(task1,1);//任務(wù)1具有比任務(wù)2高的運行權(quán)限                  
  186.     RunTaskA(task2,2);//任務(wù)2具有低的運行權(quán)限
  187. }

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


評分

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

查看全部評分

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

使用道具 舉報

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

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

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


評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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


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

回復

使用道具 舉報

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

使用道具 舉報

6#
ID:97470 發(fā)表于 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個調(diào)度器時鐘周期標志變量,需在調(diào)度器時鐘周期定時器中斷里將變量置1。
        簡單調(diào)用示例:WaitUtilTR(f.b0,2,0);

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

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

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