在原作者smset基礎(chǔ)上增加1、可以在宏定義里選擇8位 16位還是32位2、定義任務(wù)用TASK開頭
- // 任務(wù)0 任務(wù)定義以TASK開頭
- TASK task0(){
- _SS
- while(1){
- WaitX(50);
- LED0=!LED0;
- }
- _EE
- }
復制代碼
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.png (4.54 KB, 下載次數(shù): 56)
下載附件
2020-7-3 11:02 上傳
全部資料51hei下載地址:
小小調(diào)度器1.1.6問星整理版.zip
(2.95 KB, 下載次數(shù): 43)
2020-7-3 10:18 上傳
點擊文件名下載附件
小小調(diào)度器1.1.6問星整理版 下載積分: 黑幣 -5
- #ifndef __xxddq_H
- #define __xxddq_H
- /*
- * @Project : 小小調(diào)度器問星整理版
- * @Descripttion : 可設(shè)置選擇8/16/32版本,在原來的基礎(chǔ)上進一步增強
- * @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、增加 普通函數(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ù)使用
- */
- /****小小調(diào)度器開始********************************************/
- //可根據(jù)編譯器環(huán)境修改定義變量位數(shù)類型,如果出現(xiàn)重復定義錯誤提示,可以注釋掉變量類型定義
- #define U8 unsigned char //8位變量類型定義
- #define U16 unsigned int //16位變量類型定義
- #define U32 unsigned long //32位變量類型定義
- #define MAXTASKS 2 //定義調(diào)度器主任務(wù)數(shù):1-255
- #define BITS 8 //定義調(diào)度器位數(shù)可選值:8/16/32
- #define NORMALDELAY 0 //普通函數(shù)無阻塞延時開關(guān):0=關(guān);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);
- //任務(wù)頭
- #define _SS static U8 _lc=0; switch(_lc){default:
- //任務(wù)尾
- #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的位數(shù)調(diào)度器定義的位數(shù)一樣;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調(diào)用的任務(wù)里 實時性更高 等待某個條件
- #define WaitUntilR(A) do { while(!(A)) WaitX(0);} while(0);
- //只能用在RunTask調(diào)用的任務(wù)里 實時性更高 等待某個條件為某個值 A條件變量;VAL條件值
- #define WAITUNTILR(A,VAL) do { WaitX(0);} while((A)!=VAL);
- //只能用在RunTask調(diào)用的任務(wù)里 實時性更高 等待某個條件或超時溢出
- #define WaitUtilTR(A,TimeOut) do {static TASK _count=(TimeOut); do { WaitX(0); _count--; } while((!(A))&&(_count>0));} while(0);
- //只能用在RunTask調(diào)用的任務(wù)里 實時性更高 等待某個條件為某個值或超時溢出
- #define WAITUNTILTR(A,VAL,TimeOut) do {static TASK _count=(TimeOut); do { WaitX(0); _count--; } while(((A)!=VAL)&&(_count>0));} while(0);
- //運行任務(wù)
- #define RunTask(TaskName,TaskID) do { if (timers[TaskID]==0) { TASK d=TaskName(); while(timers[TaskID]!=d) timers[TaskID]=d;} } while(0);
- //運行任務(wù),前面的任務(wù)優(yōu)先保證執(zhí)行
- #define RunTaskA(TaskName,TaskID) do { if (timers[TaskID]==0) {TASK d=TaskName(); while(timers[TaskID]!=d) timers[TaskID]=d;continue;} } while(0);
- //調(diào)用子任務(wù)
- #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);
- //調(diào)用子任務(wù),傳入一個參數(shù),傳入的參數(shù)需在釋放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);
- //調(diào)用子任務(wù),傳入二個參數(shù),傳入的參數(shù)需在釋放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);
- //初始化任務(wù)調(diào)度
- #define InitTasks() do {U8 i; for(i=MAXTASKS;i>0 ;i--) timers[i-1]=0; } while(0);
- #if (NORMALDELAY==0)
- //更新任務(wù)
- #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)
- //更新任務(wù)
- #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);
- //普通函數(shù)無阻塞延時 只能被主任務(wù),以及主任務(wù)調(diào)用的函數(shù),及主任務(wù)調(diào)用的函數(shù)調(diào)用的函數(shù) 使用
- #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);
- //發(fā)送信號量
- #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);
- /*****小小調(diào)度器結(jié)束*******************************************************/
- /*****調(diào)用示例*************************************************
- #include "xxddq.h"
- sbit LED1 = P2^1;
- sbit LED2 = P2^2;
- sbit LED0 = P2^5;
- // 任務(wù)0 任務(wù)定義以TASK開頭
- TASK task0(){
- _SS
- while(1){
- WaitX(50);
- LED0=!LED0;
- }
- _EE
- }
- // 任務(wù)1 任務(wù)定義以TASK開頭
- TASK task1(){
- _SS
- while(1){
- // WaitX(100);
- // LED1=!LED1;
- test1();
- }
- _EE
- }
- // 任務(wù)2 任務(wù)定義以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中斷服務(wù)
- void INTT0(void) interrupt 1 using 1
- {
- TL0=0Xff; //10ms 重裝
- TH0=0XDB; //b7;
- UpdateTimers(); //更新任務(wù)
- RunTask(task0,0); //任務(wù)0具有精確按時獲得執(zhí)行的權(quán)限,要求:task0每次執(zhí)行消耗時間<0.5個 ticket
- }
- //無阻塞延時 只能被主任務(wù),以及主任務(wù)調(diào)用的函數(shù),及主任務(wù)調(diào)用的函數(shù)調(diào)用的函數(shù) 使用
- //TASK i 定義參數(shù)確保參數(shù)位數(shù)和調(diào)度器內(nèi)定義的位數(shù)一樣
- void delayx(TASK i){
- DELAYX(i); //普通函數(shù)無阻塞延時
- }
- //普通函數(shù)
- void test1(){
- delayx(50);
- LED0=1;
- delayx(50);
- LED0=0;
- delayx(50);
- LED0=1;
- delayx(50);
- LED0=0;
- }
- //主任務(wù) 主任務(wù)函數(shù)名必須為 runTasks
- void runTasks()
- {
- // RunTask(task0,0);
- RunTaskA(task1,1);//任務(wù)1具有比任務(wù)2高的運行權(quán)限
- RunTaskA(task2,2);//任務(wù)2具有低的運行權(quán)限
- }
- // 主循環(huán)
- void main()
- {
- InitT0();
- InitTasks(); //初始化任務(wù),實際上是給timers清零
-
- //主循環(huán)或主循環(huán)內(nèi)的函數(shù)或主循環(huán)函數(shù)調(diào)用的子函數(shù)里,必須有一個無阻塞延時函數(shù)執(zhí)行
- while(1){
- // delayx(1); //無阻塞延時1個任務(wù)時鐘
- test1(); //調(diào)用了無阻塞延時函數(shù)的普通函數(shù)
- // runTasks(); //沒有普通函數(shù)調(diào)用無阻塞延時函數(shù)時,可以只調(diào)用主任務(wù)
- }
- }
- **************************************************************/
- #endif
復制代碼
|