在原作者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下载地址:
小小调度器1.1.6问星整理版.zip
(2.95 KB, 下载次数: 43)
- #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
复制代码
|