一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: smsetyl
收起左侧

[其他综合] 小小调度器-C语言通用

[复制链接]
发表于 2014-8-26 20:13 来自手机 | 显示全部楼层
smsetyl 发表于 2014-8-26 08:42
嗯。上个月就被封了。

我复制粘贴到啊莫那里了,不过有乱码,有人不满意啊,我又截图发过去了。
发表于 2014-8-26 20:39 | 显示全部楼层
社建电子 发表于 2014-8-26 20:13
我复制粘贴到啊莫那里了,不过有乱码,有人不满意啊,我又截图发过去了。

看到了  
发表于 2014-8-26 22:09 | 显示全部楼层
smsetyl 发表于 2014-8-26 08:42
嗯。上个月就被封了。

为什么封啊,你那个贴子很精采的说

发表于 2014-8-26 22:38 | 显示全部楼层
smsetyl 发表于 2014-8-26 16:33
除了高度通用外,小小调度器与其他调度器的另一个很大的区别是:
小小调度器与各种框架兼容,因为小小调度 ...

新版本放在哪里呢?顶楼?如果可以楼主最好开个github之类的账号,更加方便了,没人能够删得了你


发表于 2014-8-27 00:01 | 显示全部楼层
smsetyl 发表于 2014-8-26 09:24
顶楼发布的版本,有细微改进:
比如采用:(__LINE__%255)+1,更加简洁,并且出现重复的概率进一步降低。原 ...

这个改进好,更易读了。
发表于 2014-8-27 00:12 | 显示全部楼层
RunTaskA 和 RunTask之间的差别还体会不出来
发表于 2014-8-27 01:06 | 显示全部楼层
很好的东西,绝对支持。

前不久,我的账号在阿莫那里也不能用了,但只是需要重新邮箱确认,改密码。
 楼主| 发表于 2014-8-27 09:33 | 显示全部楼层
gaojxp 发表于 2014-8-27 01:06
很好的东西,绝对支持。

前不久,我的账号在阿莫那里也不能用了,但只是需要重新邮箱确认,改密码。

谢谢。
发表于 2014-8-31 09:27 | 显示全部楼层
jesen_2010 发表于 2014-8-27 00:12
RunTaskA 和 RunTask之间的差别还体会不出来

主要差别在RunTaskA有continue语句,这样就可以优先执行该任务,而跳过后面的任务。

欢迎探讨。
 楼主| 发表于 2014-9-1 16:17 | 显示全部楼层
本帖最后由 smsetyl 于 2014-9-1 16:20 编辑

在IAR6.7下编译通过。(选用:Misra C 2004)


/****小小调度器开始**********************************************/
#define MAXTASKS 2U
volatile static unsigned char timers[MAXTASKS];
#define _SS    static unsigned char _lc=0U; switch(_lc){case 0U:  
#define _EE     break; default:break;}  _lc=0U;  return 255U;
#define WaitX(tickets)   _lc=(unsigned char)(__LINE__)%255U+1U;  if(_lc){return (tickets);}  break; case ((unsigned char)(__LINE__)%255U)+1U:

#define RunTask(TaskName,TaskID)  do {if (timers[(TaskID)]==0U){ timers[(TaskID)]=(TaskName)(); } } while(0)  
#define RunTaskA(TaskName,TaskID) { if (timers[(TaskID)]==0U) {timers[(TaskID)]=(TaskName)(); continue;} }    /*前面的任务优先保证执行*/

#define CallSub(SubTaskName) do {unsigned char currdt; _lc=(unsigned char)(__LINE__)%255U+1U; if(_lc) {return 0U;} break; case (unsigned char)(__LINE__)%255U+1U:  currdt=(SubTaskName)(); if(currdt!=255U) {return currdt;}} while(0);
#define InitTasks() do {unsigned char i; for(i=MAXTASKS;i>0U ;i--) {timers[i-1U]=0U;} } while(0)
#define UpdateTimers() do { unsigned char i;  for(i=MAXTASKS;i>0U ;i--){      if(timers[i-1U]!=0U){          if(timers[i-1U]!=255U) { timers[i-1U]--;} } }} while(0)

#define SEM unsigned int
/*初始化信号量*/
#define InitSem(sem) (sem)=0;
/*等待信号量*/
#define WaitSem(sem) do{ (sem)=1; WaitX(0); if ((sem)>0) return 1;} while(0);
/*等待信号量或定时器溢出, 定时器tickets 最大为0xFFFE*/
#define WaitSemX(sem,tickets)  do { (sem)=(tickets)+1; WaitX(0); if((sem)>1){ (sem)--;  return 1;} } while(0);
/*发送信号量*/
#define SendSem(sem)  do {(sem)=0;} while(0);

static unsigned char task1(void);
static unsigned char task11(void);static unsigned char task2(void);

/*****小小调度器结束*******************************************************/

static unsigned char task11(void){
  static int i;  
_SS
  for(i=0;i<11;i++){   
    WaitX(10U);
  }
  
_EE
}

static unsigned char task1(void){
   
_SS
  while(1){   
    WaitX(10U);
    CallSub(task11);
  }
  
_EE
}

static unsigned char task2(void){
   
_SS
  while(1){   
    WaitX(10U);   
  }
  
_EE
}

int main(void)
{
  InitTasks();
  while(1){   
    UpdateTimers();
    RunTask(task1,0);  
    RunTask(task2,1);  
  }
}



本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-20 06:27 , Processed in 0.047986 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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