在原作者smset基礎上增加1、可以在宏定義里選擇8位 16位還是32位2、定義任務用TASK開頭
- // 任務0 任務定義以TASK開頭
- TASK task0(){
- _SS
- while(1){
- WaitX(50);
- LED0=!LED0;
- }
- _EE
- }
復制代碼
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.png (4.54 KB, 下載次數: 56)
下載附件
2020-7-3 11:02 上傳
全部資料51hei下載地址:
小小調度器1.1.6問星整理版.zip
(2.95 KB, 下載次數: 43)
2020-7-3 10:18 上傳
點擊文件名下載附件
小小調度器1.1.6問星整理版 下載積分: 黑幣 -5
- #ifndef __xxddq_H
- #define __xxddq_H
- /*
- * @Project : 小小調度器問星整理版
- * @Descripttion : 可設置選擇8/16/32版本,在原來的基礎上進一步增強
- * @version : 1.1.6 maintask版
- * @Author : smset
- * @Date : 2015-06-02 09:02:31
- * @LastEditors : 問星
- * @LastEditTime : 2020-07-03 09:54:57
- * @History :
- * 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、添加變量位數類型定義,方便根據編譯器環境定義修改
- * 注意:無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數使用
- */
- /****小小調度器開始********************************************/
- //可根據編譯器環境修改定義變量位數類型,如果出現重復定義錯誤提示,可以注釋掉變量類型定義
- #define U8 unsigned char //8位變量類型定義
- #define U16 unsigned int //16位變量類型定義
- #define U32 unsigned long //32位變量類型定義
- #define MAXTASKS 2 //定義調度器主任務數:1-255
- #define BITS 8 //定義調度器位數可選值:8/16/32
- #define NORMALDELAY 0 //普通函數無阻塞延時開關:0=關;1=開
- #define SEM U16 //信號量定義宏
- #if (BITS==8)
- #define TASK U8
- #define TICKET_MAX 0xFF
- #endif
- #if (BITS==16)
- #define TASK U16
- #define TICKET_MAX 0xFFFF
- #endif
- #if (BITS==32)
- #define TASK U32
- #define TICKET_MAX 0xFFFFFFFF
- #endif
- volatile TASK timers[MAXTASKS];
- #if (NORMALDELAY==1)
- volatile TASK delaycount;
- #endif
- void runTasks(void);
- //任務頭
- #define _SS static U8 _lc=0; switch(_lc){default:
- //任務尾
- #define _EE ;}; _lc=0; return TICKET_MAX;
- //等待X個時鐘周期
- #define WaitX(tickets) do { _lc=(__LINE__%255)+1; return (tickets) ;case (__LINE__%255)+1:;} while(0);
- //等待某個條件
- #define WaitUntil(A) do { while(!(A)) WaitX(1);} while(0);
- //等待某個條件為某個值 A條件變量;VAL條件值
- #define WAITUNTIL(A,VAL) do { WaitX(1);} while((A)!=VAL);
- //等待某個條件或超時溢出
- #define WaitUtilT(A,TimeOut) do {static TASK _count=(TimeOut); do { WaitX(1); _count--; } while((!(A))&&(_count>0));} while(0);
- //等待某個條件為某個值或超時溢出
- #define WAITUNTILT(A,VAL,TimeOut) do {static TASK _count=(TimeOut); do { WaitX(1); _count--; } while(((A)!=VAL)&&(_count>0));} while(0);
- //等待某個條件為某個值或超時溢出 A條件變量;VAL條件值;TaskVAL超時值,不能為0,和TaskVAL的位數調度器定義的位數一樣;ONLY超時判斷唯一序號
- #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);
- //只能用在RunTask調用的任務里 實時性更高 等待某個條件
- #define WaitUntilR(A) do { while(!(A)) WaitX(0);} while(0);
- //只能用在RunTask調用的任務里 實時性更高 等待某個條件為某個值 A條件變量;VAL條件值
- #define WAITUNTILR(A,VAL) do { WaitX(0);} while((A)!=VAL);
- //只能用在RunTask調用的任務里 實時性更高 等待某個條件或超時溢出
- #define WaitUtilTR(A,TimeOut) do {static TASK _count=(TimeOut); do { WaitX(0); _count--; } while((!(A))&&(_count>0));} while(0);
- //只能用在RunTask調用的任務里 實時性更高 等待某個條件為某個值或超時溢出
- #define WAITUNTILTR(A,VAL,TimeOut) do {static TASK _count=(TimeOut); do { WaitX(0); _count--; } while(((A)!=VAL)&&(_count>0));} while(0);
- //運行任務
- #define RunTask(TaskName,TaskID) do { if (timers[TaskID]==0) { TASK d=TaskName(); while(timers[TaskID]!=d) timers[TaskID]=d;} } while(0);
- //運行任務,前面的任務優先保證執行
- #define RunTaskA(TaskName,TaskID) do { if (timers[TaskID]==0) {TASK d=TaskName(); while(timers[TaskID]!=d) timers[TaskID]=d;continue;} } while(0);
- //調用子任務
- #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);
- //調用子任務,傳入一個參數,傳入的參數需在釋放CPU前使用
- #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);
- //調用子任務,傳入二個參數,傳入的參數需在釋放CPU前使用
- #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);
- //初始化任務調度
- #define InitTasks() do {U8 i; for(i=MAXTASKS;i>0 ;i--) timers[i-1]=0; } while(0);
- #if (NORMALDELAY==0)
- //更新任務
- #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);
- #endif
- #if (NORMALDELAY==1)
- //更新任務
- #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);
- //普通函數無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數 使用
- #define DELAYX(tickets) do{delaycount=tickets;while(delaycount>0) {runTasks();}}while(0);
- #endif
- //初始化信號量
- #define InitSem(sem) do{sem=0;}while(0);
- //等待信號量
- #define WaitSem(sem) do{ sem=1; WaitX(0); if (sem>0) return 1;} while(0);
- //發送信號量
- #define SendSem(sem) do {sem=0;} while(0);
- //等待信號量或定時器溢出
- #define WaitSemX(sem, tickets) do{sem=tickets+1;WaitX(0);if(sem>1){sem--;return 1;}}while (0);
- /*****小小調度器結束*******************************************************/
- /*****調用示例*************************************************
- #include "xxddq.h"
- sbit LED1 = P2^1;
- sbit LED2 = P2^2;
- sbit LED0 = P2^5;
- // 任務0 任務定義以TASK開頭
- TASK task0(){
- _SS
- while(1){
- WaitX(50);
- LED0=!LED0;
- }
- _EE
- }
- // 任務1 任務定義以TASK開頭
- TASK task1(){
- _SS
- while(1){
- // WaitX(100);
- // LED1=!LED1;
- test1();
- }
- _EE
- }
- // 任務2 任務定義以TASK開頭
- TASK task2(){
- _SS
- while(1){
- WaitX(100);
- LED2=!LED2;
- }
- _EE
- }
- // TIME0初始化
- void InitT0()
- {
- TMOD = 0x21;
- IE |= 0x82; // 12t
- TL0=0Xff;
- TH0=0XDB;
- TR0 = 1;
- }
- // TIM0中斷服務
- void INTT0(void) interrupt 1 using 1
- {
- TL0=0Xff; //10ms 重裝
- TH0=0XDB; //b7;
- UpdateTimers(); //更新任務
- RunTask(task0,0); //任務0具有精確按時獲得執行的權限,要求:task0每次執行消耗時間<0.5個 ticket
- }
- //無阻塞延時 只能被主任務,以及主任務調用的函數,及主任務調用的函數調用的函數 使用
- //TASK i 定義參數確保參數位數和調度器內定義的位數一樣
- void delayx(TASK i){
- DELAYX(i); //普通函數無阻塞延時
- }
- //普通函數
- void test1(){
- delayx(50);
- LED0=1;
- delayx(50);
- LED0=0;
- delayx(50);
- LED0=1;
- delayx(50);
- LED0=0;
- }
- //主任務 主任務函數名必須為 runTasks
- void runTasks()
- {
- // RunTask(task0,0);
- RunTaskA(task1,1);//任務1具有比任務2高的運行權限
- RunTaskA(task2,2);//任務2具有低的運行權限
- }
- // 主循環
- void main()
- {
- InitT0();
- InitTasks(); //初始化任務,實際上是給timers清零
-
- //主循環或主循環內的函數或主循環函數調用的子函數里,必須有一個無阻塞延時函數執行
- while(1){
- // delayx(1); //無阻塞延時1個任務時鐘
- test1(); //調用了無阻塞延時函數的普通函數
- // runTasks(); //沒有普通函數調用無阻塞延時函數時,可以只調用主任務
- }
- }
- **************************************************************/
- #endif
復制代碼
|