搜索
bottom↓
回复: 86

小小调度器1.1重新整理版,8位16位32位可以选择定义

  [复制链接]

出0入92汤圆

发表于 2018-11-16 13:32:51 | 显示全部楼层 |阅读模式
一直在使用smset大佬的小小调度器,最近重新整理了一个,作为单独的头文件使用

1、可以在宏定义里选择8位 16位还是32位
2、定义任务用TASK开头
//  任务0 任务定义以TASK开头
TASK task0(){
_SS
  while(1){
   WaitX(50);
   LED0=!LED0;   
  }
_EE
}
3、增加 等待某个条件为某个值可以设置要等待的值
WAITUNTIL(A,3) //等待A的值为3后继续执行
4、增加调用子任务传入参数,传入的参数需在释放CPU前使用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-16 13:42:30 | 显示全部楼层
switch  case 被你玩穿了都~

出0入0汤圆

发表于 2018-11-16 14:06:04 | 显示全部楼层
谢谢分享。看看。

出0入0汤圆

发表于 2018-11-16 14:10:58 来自手机 | 显示全部楼层
谢谢楼主分享。

出0入0汤圆

发表于 2018-11-16 14:41:56 | 显示全部楼层
在8位机上用调度器,很好。
谢谢楼主分享。

出0入0汤圆

发表于 2018-11-16 14:44:47 | 显示全部楼层
支持一下,还没玩得精透

出0入98汤圆

发表于 2018-11-16 14:58:10 | 显示全部楼层
MARK一下,备用

出0入13汤圆

发表于 2018-11-16 15:17:14 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2018-11-16 15:50:28 | 显示全部楼层
转一个smset的GOTO版

#include <stc89c51.h>
#define MAXTASKS 3

//-------------小小调度器 goto版本----begin---------------------------------------

//注意咯: 这个版本,不再基于ProtoThread 原理!!!! 任务中可以随意使用switch case啦!!!
//以后各位基于goto 机制的diy版本,不用再称为基于ProtoThread。

#define _SS(N) static unsigned char STATE=0; switch(STATE){ STATES##N;}
#define _EE    ; STATE=0; return 255;

#define WaitX(A,tickets)  do {STATE=A; return tickets ;} while(0); ST(A):

#define RunTask(TaskName,TaskID) do { if (timers[TaskID]==0) timers[TaskID]=TaskName(); }  while(0);
#define RunTaskA(TaskName,TaskID) { if (timers[TaskID]==0) {timers[TaskID]=TaskName(); continue;} }   //?°??μ?è???ó??è±£?¤?′DD

#define CallSubX(A,SubTaskName) do {unsigned char currdt; STATE=A; return 0; ST(A):  currdt=SubTaskName(); if(currdt!=255) return currdt;} while(0);
#define InitTasks() {unsigned char i; for(i=MAXTASKS;i>0 ;i--) timers[i-1]=0; }
#define UpdateTimers() {unsigned char i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=255)) timers[i-1]--;}}

#define EXIT   do {STATE=0; return 255;} while(0);
#define RESTART  do {STATE=0; return 0;} while(0);

volatile unsigned char timers[MAXTASKS];

#define ST(A) ST##_##A
#define GO(A)  case A: goto ST(A);

#define STATES1  GO(1);
#define STATES2  GO(1);GO(2);
#define STATES3  GO(1);GO(2);GO(3);
#define STATES4  GO(1);GO(2);GO(3);GO(4);
#define STATES5  GO(1);GO(2);GO(3);GO(4);GO(5);
#define STATES6  GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);
#define STATES7  GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);GO(7);
#define STATES8  GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);GO(7);GO(8);
#define STATES9  GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);GO(7);GO(8);GO(9);
#define STATES10 GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);GO(7);GO(8);GO(9);GO(10);
#define STATES11 GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);GO(7);GO(8);GO(9);GO(10);GO(11);
#define STATES12 GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);GO(7);GO(8);GO(9);GO(10);GO(11);GO(12);
#define STATES13 GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);GO(7);GO(8);GO(9);GO(10);GO(11);GO(12);GO(13);
#define STATES14 GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);GO(7);GO(8);GO(9);GO(10);GO(11);GO(12);GO(13);GO(14);
#define STATES15 GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);GO(7);GO(8);GO(9);GO(10);GO(11);GO(12);GO(13);GO(14);GO(15);
#define STATES16 GO(1);GO(2);GO(3);GO(4);GO(5);GO(6);GO(7);GO(8);GO(9);GO(10);GO(11);GO(12);GO(13);GO(14);GO(15);GO(16);
//#define STATESXX ....若嫌状态不够,还可再加哦,反正是宏,再多都不要钱的。

#define SEM unsigned int
#define InitSem(sem) sem=0;
#define WaitSem(A,sem) do{ sem=1; WaitX(A,0); if (sem>0) return 1;} while(0);
#define WaitSemX(A,sem,tickets)  do { sem=tickets+1; WaitX(A,0); if(sem>1){ sem--;  return 1;} } while(0);
#define SendSem(sem)  do {sem=0;} while(0);

//------------小小调度器 goto版本 end------------------------------------------


sbit LED1 = P2^1;
sbit LED2 = P2^2;

sbit LED0 = P2^5;

unsigned char task0(){
_SS(1)  //本任务用了1个wait,所以这里就是_SS(1)
  while(1){
   WaitX(1,50);
   LED0=!LED0;   
  }
_EE
}

unsigned char  task1(){
_SS(1)  //本任务用了1个wait,所以这里就是_SS(1)
  while(1){
   WaitX(1,100);
   LED1=!LED1;   
  }
_EE
}

unsigned char  task2(){
_SS(3)   //本任务用了3个wait,所以这里就是_SS(3)
  while(1){
   WaitX(1,100);
   LED2=!LED2;   
   WaitX(2,100);
   LED2=!LED2;   
   WaitX(3,100);
   LED2=!LED2;   
  }
_EE
}

void InitT0()
{
        TMOD = 0x21;
        IE |= 0x82;  // 12t
        TL0=0Xff;
        TH0=0XDB;
        TR0 = 1;
}

void INTT0(void) interrupt 1 using 1
{
    TL0=0Xff;    //10ms ??
    TH0=0XDB;//b7;   

    UpdateTimers();

    RunTask(task0,0);//高级别任务,在中断里执行,可剥夺低级别任务。
}




void main()
{
        InitT0();
        InitTasks(); //?????,?????timers??
        while(1){
//           RunTask(task0,0);
           RunTaskA(task1,1);//??1?????2??????                  
           RunTaskA(task2,2);//??2????????                  
      }
}

出0入96汤圆

发表于 2018-11-16 15:57:41 | 显示全部楼层
记号一下,抽空学习啊

出250入17汤圆

发表于 2018-11-16 16:33:03 | 显示全部楼层
学习学习。还是菜鸟

出0入0汤圆

发表于 2018-11-16 17:04:54 | 显示全部楼层
收藏先   

出0入92汤圆

 楼主| 发表于 2018-11-17 07:06:41 | 显示全部楼层
xad74 发表于 2018-11-16 15:50
转一个smset的GOTO版

#include

goto版的我还没仔细看过 ,以后有时间的时候也仔细看看。

出0入92汤圆

 楼主| 发表于 2018-11-17 07:07:55 | 显示全部楼层
su33691 发表于 2018-11-16 14:41
在8位机上用调度器,很好。
谢谢楼主分享。

我整理的这个8位 16位 32位都可以配置选择

出0入0汤圆

发表于 2018-11-17 07:33:54 | 显示全部楼层
谷歌浏览器提示有风险呢

出0入0汤圆

发表于 2018-11-17 08:28:05 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2018-11-17 08:53:06 | 显示全部楼层
收藏了  

出0入0汤圆

发表于 2018-11-17 08:56:42 来自手机 | 显示全部楼层
谢谢,收下看看

出0入92汤圆

 楼主| 发表于 2018-11-17 09:23:13 | 显示全部楼层
浮华一生 发表于 2018-11-17 07:33
谷歌浏览器提示有风险呢

压缩包里就一个C的头文件

出0入92汤圆

 楼主| 发表于 2018-11-17 09:25:52 | 显示全部楼层
现在把“xxddq.h”的完整内容贴出来

#ifndef __xxddq_H
#define __xxddq_H
/****   版本:1.1.2
/****   2018-11-14 BY 问星整理版    **************************/
/****小小调度器开始********************************************/
#define MAXTASKS 3          //定义调度器主任务数:1-255
#define BITS 16             //定义调度器位数可选值:8/16/32
#define SEM unsigned int    //信号量定义宏

#if (BITS==8)
#define TASK unsigned char
#define TICKET_MAX 0xFF
#endif

#if (BITS==16)
#define TASK unsigned short
#define TICKET_MAX 0xFFFF
#endif

#if (BITS==32)
#define TASK unsigned long
#define TICKET_MAX 0xFFFFFFFF
#endif

volatile TASK timers[MAXTASKS];

//任务头
#define _SS static unsigned char _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);

//只能用在RunTask调用的任务里 等待某个条件
#define WaitUntilR(A)    do { while(!(A)) WaitX(0);} while(0);

//只能用在RunTask调用的任务里 等待某个条件为某个值        A条件变量;VAL条件值
#define WAITUNTILR(A,VAL)  do { WaitX(0);} while((A)!=VAL);

//运行任务
#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 {unsigned char i; for(i=MAXTASKS;i>0 ;i--) timers[i-1]=0; } while(0);

//更新任务
#define UpdateTimers() do{unsigned char i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=TICKET_MAX)) timers[i-1]--;}} while(0);

//初始化信号量
#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;   
  }
_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
}
//  主循环
void main()
{
    InitT0();
    InitTasks(); //初始化任务,实际上是给timers清零
    while(1){
//      RunTask(task0,0);
        RunTaskA(task1,1);//任务1具有比任务2高的运行权限                  
        RunTaskA(task2,2);//任务2具有低的运行权限                  
    }
}
**************************************************************/
#endif

出0入0汤圆

发表于 2018-11-17 09:30:40 | 显示全部楼层
有用信号量的例子吗?多谢。

出0入0汤圆

发表于 2018-11-17 09:31:30 | 显示全部楼层
出现这样的警告:
LED.c(19): warning C294: unreachable code
LED.c(28): warning C294: unreachable code
LED.c(37): warning C294: unreachable code

出20入118汤圆

发表于 2018-11-17 09:36:08 来自手机 | 显示全部楼层
mark下,有空移植下

出0入92汤圆

 楼主| 发表于 2018-11-17 09:42:28 | 显示全部楼层
yjbin 发表于 2018-11-17 09:31
出现这样的警告:
LED.c(19): warning C294: unreachable code
LED.c(28): warning C294: unreachable code ...

用的什么单片机?什么环境下编译的?

出0入0汤圆

发表于 2018-11-17 21:16:48 | 显示全部楼层
之前整理了8和16位的,但是没弄32的,下载看下。多谢分享~

出0入0汤圆

发表于 2018-11-17 21:50:10 | 显示全部楼层
xyb852 发表于 2018-11-17 09:42
用的什么单片机?什么环境下编译的?

keil STC单片机

出0入0汤圆

发表于 2018-11-17 21:53:48 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-18 13:01:09 来自手机 | 显示全部楼层
调度器,很好

出0入92汤圆

 楼主| 发表于 2018-11-18 18:23:26 | 显示全部楼层

编译成功了的,提示的那warning大概意思是函数里有死循环,不用管

出0入92汤圆

 楼主| 发表于 2018-11-18 18:34:33 | 显示全部楼层
yjbin 发表于 2018-11-17 09:30
有用信号量的例子吗?多谢。

信号量使用的例子

#include "xxddq.h"
#include "reg52.h"

sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED0 = P2^5;

SEM taskrun;                //定义信号量

//  任务0 任务定义以TASK开头
TASK task0(){
_SS
  while(1){
   WaitX(50);
   LED0=!LED0;   
  }
_EE
}
//  任务1 任务定义以TASK开头
TASK task1(){
_SS
        InitSem(taskrun);        //初始化信号量
  while(1){
        //        WaitX(100);
                WaitSem(taskrun);        //等待信号量 收到任务2发送的信号量才运行后边的代码
                LED1=!LED1;   
  }
_EE
}
//  任务2 任务定义以TASK开头
TASK task2(){
_SS
    while(1){
                        WaitX(100);
                        LED2=!LED2;
                        SendSem(taskrun);        //发送信号量
                        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
}
//  主循环
void main()
{
    InitT0();
    InitTasks(); //初始化任务,实际上是给timers清零
    while(1){
//      RunTask(task0,0);
        RunTaskA(task1,1);//任务1具有比任务2高的运行权限                  
        RunTaskA(task2,2);//任务2具有低的运行权限                  
    }
}

出200入0汤圆

发表于 2018-11-19 11:24:35 | 显示全部楼层
标记一下,抽时间测试下

出5入10汤圆

发表于 2018-11-19 14:52:24 | 显示全部楼层
顶楼主,好东西。

出0入0汤圆

发表于 2018-11-19 16:47:50 | 显示全部楼层
感谢分享

出0入95汤圆

发表于 2018-11-19 18:45:01 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2018-11-20 09:34:47 | 显示全部楼层
非常好,谢谢分亨!

出0入0汤圆

发表于 2018-11-20 10:07:37 | 显示全部楼层
谢谢分亨           

出0入0汤圆

发表于 2018-11-20 16:19:04 | 显示全部楼层
试了下,确实好用,尤其是资源小的片子

出0入0汤圆

发表于 2018-11-21 09:43:15 | 显示全部楼层

顶楼主,好东西。

出0入0汤圆

发表于 2018-11-21 11:31:28 | 显示全部楼层
感谢分享,我也分享一个在国产M0+芯片上的DEMO

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2018-11-21 17:57:49 | 显示全部楼层
本帖最后由 liaihua1997 于 2018-11-21 18:18 编辑


你用STC的单片机调通了吗,能不能发上来看一下,我编译也是出现三个这样的警告,但下到单片机没有反映,灯不亮
修改:不好意思,可以运行了是我中断ET0没有开,太习惯用STC烧录软件生成代码了。

出0入0汤圆

发表于 2018-11-21 18:11:45 | 显示全部楼层
小小调度器,用KEIL编译出现三个警告的消除方法:任选一种
1,换用KEIL2进行编译。
2,修改宏定义:#define _EE ;}; _lc=0; return TICKET_MAX;
    为:#define _EE   ;};

出0入8汤圆

发表于 2018-11-21 18:24:01 | 显示全部楼层
su33691 发表于 2018-11-21 18:11
小小调度器,用KEIL编译出现三个警告的消除方法:任选一种
1,换用KEIL2进行编译。
2,修改宏定义:#define ...

刚试过这样改可以运行,编译没有警告了,会有什么限制吗?

出0入0汤圆

发表于 2018-11-21 20:04:53 | 显示全部楼层
谢谢,学习了小小调度器

出0入0汤圆

发表于 2018-11-21 20:19:12 | 显示全部楼层
支持一下,

出0入0汤圆

发表于 2018-11-21 21:38:59 来自手机 | 显示全部楼层
谢谢,收下看看

出0入0汤圆

发表于 2018-11-21 23:09:38 | 显示全部楼层
学习了,好方法

出0入8汤圆

发表于 2018-11-22 18:12:32 | 显示全部楼层
mark。。。

出0入0汤圆

发表于 2018-12-27 18:41:45 | 显示全部楼层
谢谢,更新一下老版本

出0入0汤圆

发表于 2018-12-27 20:53:56 | 显示全部楼层

谢谢,学习了小小调度器

出0入0汤圆

发表于 2018-12-29 09:05:30 | 显示全部楼层
谢谢大佬们分享!!!

出0入0汤圆

发表于 2018-12-29 13:26:47 来自手机 | 显示全部楼层
mark,有空试一下

出0入53汤圆

发表于 2018-12-29 13:31:18 | 显示全部楼层
谢谢分享,收藏一下有时间过来研究一下

出0入0汤圆

发表于 2019-1-24 10:28:01 | 显示全部楼层
好好学习一下。

出0入0汤圆

发表于 2019-1-24 14:39:25 来自手机 | 显示全部楼层
这个好厉害啊!我先学习一下

出0入55汤圆

发表于 2019-4-11 14:03:38 | 显示全部楼层
你好。我加入我的工程,出现了下面的错误。说的是volatile TASK timers[MAXTASKS];重定义了。怎样搞?是否要放到C文件里,这里放extern的声明?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入92汤圆

 楼主| 发表于 2019-4-11 14:18:33 | 显示全部楼层
jssd 发表于 2019-4-11 14:03
你好。我加入我的工程,出现了下面的错误。说的是volatile TASK timers[MAXTASKS];重定义了。怎样搞?是否 ...

应该是你的工程里边有别的任务管理代码存在

出0入55汤圆

发表于 2019-4-11 14:43:30 | 显示全部楼层
xyb852 发表于 2019-4-11 14:18
应该是你的工程里边有别的任务管理代码存在

确实没有。就是重复定义了。因为定义在了h文件里。而这个h文件又是包含在一个总的h文件里,所有的c文件都可以调用的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入92汤圆

 楼主| 发表于 2019-4-11 14:48:39 | 显示全部楼层
jssd 发表于 2019-4-11 14:43
确实没有。就是重复定义了。因为定义在了h文件里。而这个h文件又是包含在一个总的h文件里,所有的c文件都 ...

那你就把重复的定义替换成别名字喽

出0入55汤圆

发表于 2019-4-11 14:56:54 | 显示全部楼层
xyb852 发表于 2019-4-11 14:48
那你就把重复的定义替换成别名字喽

不是这个问题。你看下图,我换了一个名字,还是这样报错,只是报错名称变成timersss,而这个名字是刚换的,没有其它人用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入55汤圆

发表于 2019-4-11 14:59:02 | 显示全部楼层
xyb852 发表于 2019-4-11 14:48
那你就把重复的定义替换成别名字喽

我的意思是说直接在h文件里定义一个变量,当多个c文件都包含这个h文件时,就会被说成重定义。
请教:你是怎样用的呢?可以通过编译?

出0入92汤圆

 楼主| 发表于 2019-4-11 15:42:59 | 显示全部楼层
jssd 发表于 2019-4-11 14:59
我的意思是说直接在h文件里定义一个变量,当多个c文件都包含这个h文件时,就会被说成重定义。
请教:你是 ...

GOTO版的我没仔细看过,帮不了你了,你问问度娘

出0入0汤圆

发表于 2019-4-12 10:25:07 | 显示全部楼层
jssd 发表于 2019-4-11 14:59
我的意思是说直接在h文件里定义一个变量,当多个c文件都包含这个h文件时,就会被说成重定义。
请教:你是 ...

工程传上来,我帮你瞧瞧。

出0入92汤圆

 楼主| 发表于 2019-5-31 09:14:30 | 显示全部楼层
更新1.1.4 maintask版
2019-05-30
        增加:1、增加等待某个条件为某个值或超时溢出
                 A条件变量;VAL条件值;TaskVAL超时值,不能为0,和TaskVAL的位数调度器定义的位数一样;ONLY超时判断唯一序号
                 WAITUNTILO(A,VAL,TaskVAL,ONLY)
                2、添加 void runTasks(void); 声明,确保部分编译器不会报错
        注意:每增加一个WAITUNTILO(A,VAL,TaskVAL,ONLY)超时判断会增加一个调度器位数对应内存占用

2019-05-29
        修改:1、整合群主semet的普通函数无阻塞延时
                  2、添加变量位数类型定义,方便根据编译器环境定义修改
        注意:无阻塞延时 只能被主任务,以及主任务调用的函数,及主任务调用的函数调用的函数 使用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-5-31 10:33:16 | 显示全部楼层
学习一下!

出0入0汤圆

发表于 2019-6-12 08:56:07 | 显示全部楼层
xyb852 发表于 2019-5-31 09:14
更新1.1.4 maintask版
2019-05-30
        增加:1、增加等待某个条件为某个值或超时溢出

谢谢楼主分享,来学习下·······

出0入0汤圆

发表于 2019-6-12 10:12:58 | 显示全部楼层

学习一下!

出0入0汤圆

发表于 2019-6-14 00:04:26 | 显示全部楼层
很简洁嘛!~~~

出0入0汤圆

发表于 2019-6-14 04:46:28 来自手机 | 显示全部楼层
简单高效

出0入8汤圆

发表于 2019-6-14 09:06:54 | 显示全部楼层
支持邮箱,互斥,信号量等功能吗?

出0入92汤圆

 楼主| 发表于 2019-6-14 10:34:26 | 显示全部楼层
skype 发表于 2019-6-14 09:06
支持邮箱,互斥,信号量等功能吗?

互斥不支持,支持信号量。
等待某个条件为某个值或超时溢出,这功能应该比邮箱和信号量好用

出0入8汤圆

发表于 2019-6-14 18:02:04 | 显示全部楼层
邮箱的好处是还可以传递数据。

出0入92汤圆

 楼主| 发表于 2019-6-15 20:33:29 | 显示全部楼层
skype 发表于 2019-6-14 18:02
邮箱的好处是还可以传递数据。

等我有时间的时候把2.0版小小调度器研究明白后,发个整理后的2.0版,到时可以做到支持邮箱

出0入0汤圆

发表于 2019-11-20 08:30:04 | 显示全部楼层
等待楼主更新

出0入0汤圆

发表于 2019-11-20 08:33:22 | 显示全部楼层

简单高效,学习一下!

出0入0汤圆

发表于 2019-12-8 15:22:07 来自手机 | 显示全部楼层
Mark一下

出0入0汤圆

发表于 2019-12-12 22:53:44 | 显示全部楼层
小小的能量会不会能力很大

出0入0汤圆

发表于 2019-12-13 07:37:58 | 显示全部楼层
学习,谢谢!!!

出0入4汤圆

发表于 2020-3-14 15:08:53 | 显示全部楼层
多谢分享!

出0入0汤圆

发表于 2020-3-14 15:59:50 | 显示全部楼层
多谢多谢

出0入92汤圆

 楼主| 发表于 2020-7-3 10:01:38 | 显示全部楼层
更新
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)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-7-3 10:12:49 | 显示全部楼层
xyb852 发表于 2020-7-3 10:01
更新
2020-07-03
  1、增加 普通函数无阻塞延时开关宏定义,方便在不使用普通函数无阻塞延时功能时减少RAM ...

下载体验一下,谢谢楼主

出0入92汤圆

 楼主| 发表于 2020-7-24 22:59:05 | 显示全部楼层
小小调度器原作者 smset 的开源github地址。给小小调度器感兴趣的坛友。
https://github.com/smset028/xxddq

出0入92汤圆

 楼主| 发表于 2020-10-25 11:51:46 | 显示全部楼层
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,和原来一样.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入92汤圆

 楼主| 发表于 2020-11-4 13:56:53 | 显示全部楼层
2020-11-04 重要更新
  1、修复超时判断只能生效1次的BUG(群友"上善若水"发现)
     在WaitUtilT(A,TimeOut)、WAITUNTILT(A,VAL,TimeOut)、WaitUtilTR(A,TimeOut)、WAITUNTILTR(A,VAL,TimeOut)定义里增加”_count=TimeOut;“

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入92汤圆

 楼主| 发表于 2020-11-6 23:21:23 | 显示全部楼层
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、根据群主(smset)的意见,修改“_count”赋初值的位置,使之理合理
  2、修改“WaitUtilTR(A,TimeOut)、WAITUNTILTR(A,VAL,TimeOut)”定义,解决实时性高的判断等待超时时间不准的问题
     增加“T1FLAY”一个调度器周期标志变量参数,变为“WaitUtilTR(A,TimeOut,T1FLAY)、WAITUNTILTR(A,VAL,TimeOut,T1FLAY)”
     使用方式请参考例子
        //定义一个调度器周期标志联合体变量(经测试联合体包含结构体应用在宏里,C51编译器编译会有BUG)
        //用于实时性高的带超时判断的等待判断,
        //在更新调度器的定时器中断里加入 “T1F.bs=0xFF;”
        //如果超过8个需实时性高的判断,请修改“T1F.bs”为16位并添加n个“unsigned bn: 1;” 定义
        union
        {
            struct
            {
                unsigned b0: 1;
                unsigned b1: 1;
                unsigned b2: 1;
                unsigned b3: 1;
                unsigned b4: 1;
                unsigned b5: 1;
                unsigned b6: 1;
                unsigned b7: 1;
            } b;
            unsigned char bs;
        } T1F;  //一个调度器周期标志
       
        //任务0
        TASK task0(void)
        {
            _SS
            while(1)
            {
                //高实时性的等待变量f.b0==1,超时2个调度器周期
                //f.b0:等待的条件变量;
                //2:超时2个调度器时钟周期;
                //T1F.b.b0:当前超时调度器时钟周期标志位,不可重复。
                //下一个请传入“T1F.b.b1”,以此类推,
                WaitUtilTR(f.b0, 2,T1F.b.b0); //高实时性的等待变量f.b0==1,超时2个调度器周期
                if (f.b0 == 0) //超时执行
                {
                    LED0 ^= 1;  //翻转LED0
                }
                else    //符合条件执行
                {
                    LED1 ^= 1;
                }
            }
            _EE
        }
        //定时器0中断
        void INTT0(void) interrupt 1 using 1
        {
            //10ms
            TL0 = 0Xff;
            TH0 = 0XDB;
            UpdateTimers(); //更新任务
            T1F.bs=0xFF;    //将一个调度器时钟周期标志变量位全置1 增加
            // RunTask(task0, 0); //高级别任务,在中断里执行,可剥夺低级别任务。
        }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-12-12 12:10:01 | 显示全部楼层
感性分享,学习了

出0入0汤圆

发表于 2021-3-10 23:15:08 来自手机 | 显示全部楼层
一直用switch case版本的,再来研究下goto板,感谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 23:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表