搜索
bottom↓
楼主: smset

再出个调度器,极小资源单片机值得一用

  [复制链接]

出0入0汤圆

发表于 2015-2-16 10:40:59 | 显示全部楼层
有没有移植到STM32上的例程,学习下.

出0入0汤圆

发表于 2015-3-6 14:35:34 | 显示全部楼层
eddia2012 发表于 2012-12-8 22:21
当timeover = 255时相当无穷等待

/************************************************
Micro    : Ints_even_clear
Stacks   :
Note     : 清除进程传事件消息
Updata   : 2012-11-21
************************************************/
#define Ints_even_clear()                                \
                taskEvenRdy &= 0xff ^ (1<<taskID)


这里是当前任务将自已清掉。有什么用处呢?

出0入0汤圆

发表于 2015-3-8 14:37:32 | 显示全部楼层
楼主写的好厉害

出0入0汤圆

发表于 2015-3-10 16:03:20 | 显示全部楼层
smset 发表于 2012-12-18 18:29
优化无止境!呵呵,330楼看似不能再优化了,但我再尝试做一次优化:

敬请评测该版本,看是否还能优化:在k ...

你好请问这个子函数如果有参数的话怎么调用呢

出0入0汤圆

发表于 2015-3-10 16:14:46 | 显示全部楼层
holts2 发表于 2012-12-15 12:45
void  task1(){
static unsigned char lc=0; switch(lc){   case 0:
  while(1){

你好请问这个调度器如果要调用带参数的子函数,要怎么弄呢

出0入0汤圆

发表于 2015-3-10 16:29:34 | 显示全部楼层
为而不争 发表于 2015-3-10 16:14
你好请问这个调度器如果要调用带参数的子函数,要怎么弄呢

你平常乍写就咋写啊

出0入0汤圆

发表于 2015-3-10 16:38:52 | 显示全部楼层
holts2 发表于 2015-3-10 16:29
你平常乍写就咋写啊

如果里面要用到WaitX和WaitSemX,

出0入0汤圆

发表于 2015-3-10 16:41:30 | 显示全部楼层
eddia2012 发表于 2012-12-14 19:27
请出下信号量应用的例子哦。

你好请问这个调度器如果要调用带参数的子函数,要怎么弄呢

出0入0汤圆

发表于 2015-3-11 10:24:47 | 显示全部楼层
很长 很好 但还是要慢慢学 慢慢看  一下不能够懂的

出0入0汤圆

发表于 2015-3-11 16:02:05 | 显示全部楼层
LZ出个教程吧,像我这种小白真的不太看得懂

出0入0汤圆

发表于 2015-3-11 16:34:20 | 显示全部楼层
本帖最后由 tangmix 于 2015-3-11 16:39 编辑

看了一下LZ的代码,有几个问题不明白,希望LZ能帮忙解答:
unsigned char task0(){
static unsigned char _lc=0;
switch(_lc)
{
         default:
                while(1)
                {
                        //WaitX(50);
                        do
                        {
                                _lc=(__LINE__+((__LINE__%256)==0))%256;
                                return tickets ;
                        }
                        while(0);
                        case (__LINE__+((__LINE__%256)==0))%256:
                                LED0=!LED0;   
                };
};
_lc=0;
return 255;
}

这是我展开后的代码,其中的while循环是在什么时候跳出来的呢?

出0入0汤圆

发表于 2015-3-11 17:15:54 | 显示全部楼层
smset 发表于 2012-11-26 11:42
自己写的,抛砖引玉,希望大家指正哈。本例用于说明调度器的核心思想,当然也可以用,但实际上还可以做得更 ...

非常感谢 马克先

出0入0汤圆

发表于 2015-3-11 17:28:51 | 显示全部楼层
膜拜啊,这么多人顶贴,一直想学,无奈基础太差,都看不懂,直到遇到你......

出0入0汤圆

发表于 2015-3-12 14:31:43 | 显示全部楼层
你好这样的话这个调度器里面是不是就就不能再用switch 了?

出0入0汤圆

发表于 2015-3-12 15:36:38 | 显示全部楼层
如果没有定时器,怎么调度

出0入0汤圆

发表于 2015-4-10 16:11:54 | 显示全部楼层
总算仔细的看完了  mark下

出0入0汤圆

发表于 2015-4-11 14:02:37 来自手机 | 显示全部楼层
好不容易注册成功,下载来看看。

出0入0汤圆

发表于 2015-4-13 19:47:28 | 显示全部楼层
有了这个字程序方便多了。

出0入0汤圆

发表于 2015-4-16 12:12:51 | 显示全部楼层
谢谢朋友的分享,学到很多的编程技术。

出0入0汤圆

发表于 2015-4-25 11:42:03 | 显示全部楼层
学习学习。谢谢分享!

出0入0汤圆

发表于 2015-4-28 14:49:00 | 显示全部楼层
谢谢 学习了。

出0入0汤圆

发表于 2015-4-29 08:26:33 | 显示全部楼层
12年的帖子现在还有人回,这个实时性不够强,在学校用用可以,做产品不行。

出0入0汤圆

发表于 2015-4-29 08:40:11 | 显示全部楼层
一直裸奔中~是改考虑穿几件衣服了~

出0入0汤圆

发表于 2015-4-30 15:55:51 | 显示全部楼层
记号   有时间试一下

出0入0汤圆

发表于 2015-4-30 17:01:35 | 显示全部楼层
Mark,待有空学习学习!

出0入0汤圆

发表于 2015-5-1 11:25:50 | 显示全部楼层
学习研究中,谢谢!

出0入0汤圆

发表于 2015-5-1 12:12:49 | 显示全部楼层
看了好几次,收货很多,mark                    

出0入0汤圆

发表于 2015-5-1 14:07:58 | 显示全部楼层
已经收藏,好好学习一下!

出0入0汤圆

发表于 2015-5-3 19:48:10 | 显示全部楼层
好贴 Mark之                     

出0入0汤圆

发表于 2015-5-3 20:23:41 | 显示全部楼层
楼主太厉害了!

出0入0汤圆

发表于 2015-5-6 16:45:20 | 显示全部楼层
用STM32测试了一下,非常好用

出0入0汤圆

发表于 2015-5-6 16:59:21 | 显示全部楼层
WaitX不用的话就变无限回圈?所以最少要放WaitX(1)?

出0入0汤圆

发表于 2015-5-6 17:03:58 | 显示全部楼层
收藏先,谢谢分享

出0入0汤圆

发表于 2015-5-7 01:32:31 | 显示全部楼层
感谢楼主的无私奉献

出0入0汤圆

发表于 2015-5-7 09:52:14 | 显示全部楼层
我很喜欢这个调度器, 用到几个小产品中了. 可是回帖越来越没味道! 想学想用就把这1000多楼看一遍! 不要妄下结论!
关键点:
1.case后面的是标号, switch只查找标号, 找到了就直接跳转过去,
而不论这个标号在什么地方, 即使是在while中, for中, if...else...中.
2.任务函数内部不能再用switch语句了. 这种情况用 if else.
任务不要返回自定义数据, 因为return已经被赋予任务延时的特定意义, 这是返回型任务函数版本的一个强制要求.

出0入0汤圆

发表于 2015-5-7 11:11:24 | 显示全部楼层
有几个使用到do while(0);为什么要这样用?没用效果相同,有什么特别用意?
另__LINE__+((__LINE__%256)==0))%256其实直接用__LINE__效果也一样,反正__LINE__超过256存到unsigned char中还是一样把前面省略。

出0入0汤圆

发表于 2015-5-7 11:29:58 | 显示全部楼层
peecehood 发表于 2015-5-7 11:11
有几个使用到do while(0);为什么要这样用?没用效果相同,有什么特别用意?
另__LINE__+((__LINE__%256)==0 ...

do{......}while(0); 是为了多条语句的定义,防止逻辑错误.

出0入0汤圆

发表于 2015-5-7 11:47:24 | 显示全部楼层
本帖最后由 peecehood 于 2015-5-7 12:04 编辑

我想用{.....}也是一样的吧
__LINE__+((__LINE__%256)==0))%256 还是只是让他不为零,为零也没差的说

出0入0汤圆

发表于 2015-5-7 12:01:31 | 显示全部楼层
收藏留着备用

出0入0汤圆

发表于 2015-5-7 18:52:44 | 显示全部楼层
按个爪,楼主出个思路的教程呗

出0入0汤圆

发表于 2015-5-15 11:37:18 | 显示全部楼层
写的真好,读了几遍,收获很大

出0入0汤圆

发表于 2015-5-15 14:28:51 | 显示全部楼层
看来没听过 Protothreads 人还真多。
从Protothreads 中得到灵感,运用到状态机中,有时候直接用状态机来写更灵活些。

出0入0汤圆

发表于 2015-6-3 13:42:39 | 显示全部楼层
本帖最后由 rundream 于 2015-6-4 12:08 编辑

再发布一个更新的版本(感谢坛友支持):

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

/****小小调度器开始**********************************************/
#define MAXTASKS 3U
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 task0(void){
  static int i;  
_SS
  for(i=0;i<11;i++){   
    WaitX(10U);
  }  
_EE
}

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

static unsigned char task2(void){
   
_SS
  while(1){   
    WaitX(10U);   
  }  
_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);//任务0具有精确按时获得执行的权限,要求:task0每次执行消耗时间<0.5个 ticket
}

int main(void)
{
  InitT0();
  InitTasks();
  while(1){   
    RunTaskA(task1,1);  //任务一具有比任务二优先执行的权限
    RunTaskA(task2,2);  
  }
}

出0入0汤圆

发表于 2015-6-3 13:47:46 | 显示全部楼层
rundream 发表于 2015-6-3 13:42
再发布一个更新的版本(感谢坛友支持):

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

是原作者吗? 怎么换了ID ?

出0入0汤圆

发表于 2015-6-3 14:20:13 | 显示全部楼层
是的。

出0入0汤圆

发表于 2015-6-3 16:12:37 | 显示全部楼层
学习了,收藏下

出0入0汤圆

发表于 2015-6-3 16:24:10 | 显示全部楼层
rundream 发表于 2015-6-3 13:42
再发布一个更新的版本(感谢坛友支持):

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

首先谢谢您,感觉很好用。

请问这一次更新了什么新功能?
顺便请教几个问题:
1、任务指令语句长度是不是不能大于255;waitx()里面小于256是不是和这个有关?
2、任务内函数调用waitx()有什么限制么?
3、任务间数据的互相访问怎么处理比较好?比如结构体或数组
4、我如果想一个任务只运行一次就挂起自身,有什么办法?可以被其它任务唤醒并立即执行,有什么办法?

出0入0汤圆

发表于 2015-6-3 16:40:35 | 显示全部楼层
本帖最后由 rundream 于 2015-6-3 16:50 编辑
shower.xu 发表于 2015-6-3 16:24
首先谢谢您,感觉很好用。

请问这一次更新了什么新功能?


这次主要是对行号的选取做了调整,使得任务函数内代码行数在255内时,不可能出现行号重复。
另外就是调整为尽量支持Misra C 2004规则。

1、任务指令语句长度是不是不能大于255;waitx()里面小于256是不是和这个有关?
答:任务指令语句的行数是可以大于255的,在小于255行时,是不可能出现行号重复的,在大于等于255行后有出现重复的行的概率,导致编译失败,可通过加空行来解决。
      waitx()里面小于255和这个无关。

2、任务内函数调用waitx()有什么限制么?
答:WaitX()里面的值,要小于255。

3、任务间数据的互相访问怎么处理比较好?比如结构体或数组
答:使用全局变量,或自己实现FIFO。

4、我如果想一个任务只运行一次就挂起自身,有什么办法?可以被其它任务唤醒并立即执行,有什么办法?
答:使用信号量。

出0入0汤圆

发表于 2015-6-3 17:02:11 | 显示全部楼层
rundream 发表于 2015-6-3 16:40
这次主要是对行号的选取做了调整,使得任务函数内代码行数在255内时,不可能出现行号重复。
另外就是调整 ...

谢谢,明白了

出0入0汤圆

发表于 2015-6-3 21:55:27 | 显示全部楼层
楼主终于又再现了,可以有问题问问了,先下来研究一下

出0入0汤圆

发表于 2015-6-4 09:53:04 | 显示全部楼层
本帖最后由 zsdshuai 于 2015-6-4 09:59 编辑
rundream 发表于 2015-6-3 13:42
再发布一个更新的版本(感谢坛友支持):

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


太厉害了!
有几个问题请教,希望不吝赐教
1. Ticket能不能选1ms,选1ms会带来什么问题,需要注意哪些
2. 为什么要求任务局部变量要求定义为静态变量? 任务内调用的函数是不是局部变量也必须是静态的,任务内调用的子函数内用switch没问题吧
3. #define WaitX(tickets)   _lc=(unsigned char)(__LINE__)%255U+1U;  if(_lc){return (tickets);}  break; case ((unsigned char)(__LINE__)%255U)+1U:
    这个宏定义中为什么去判断 if(_lc),感觉_lc不会等于0啊
4.在PIC中移植中出现一个问题,程序框架如下
  

  1. unsigned char flg=0;

  2. main()
  3. {
  4.   if()  //按键按下
  5.    {
  6.      flg=1;
  7.    }
  8. else
  9.   {
  10.      flg=0;
  11.    }
  12. while(1)
  13.   {
  14.     if(flg)
  15.        {
  16.          RunTask(TASK2,2);
  17.        }
  18.    
  19.       RunTask(TASK0,0);
  20.       RunTask(TASK1,1);

  21.    }
  22. }
复制代码


我的本意是:如果按住按键开机,那么就让Task2运行,结果实际没按按钮也运行了Task2,我在Task2那里设置断点会跳进去,我用debug观察flg一直为0,很纳闷,可惜我对mplab这开发环境不熟悉,不知道怎么找到断点的上一条语句。我可以确定程序其它地方没有用flag。
我的问题是:我的任务写的不好,我的ticket是1ms,是不是太快了引起的,这些有可能导致出现这个问题吗?到底可能是哪里出了问题呢?对了,当时用的是793楼的调度器

希望不吝赐教,谢谢!

出0入0汤圆

发表于 2015-6-4 12:25:57 | 显示全部楼层
本帖最后由 rundream 于 2015-6-4 12:28 编辑
zsdshuai 发表于 2015-6-4 09:53
太厉害了!
有几个问题请教,希望不吝赐教
1. Ticket能不能选1ms,选1ms会带来什么问题,需要注意哪些


1. Ticket能不能选1ms,选1ms会带来什么问题,需要注意哪些
答. Ticket可以选1ms,选1ms最大的区别是:好处,延迟更精确,中断级别的任务实时性更好。   坏处:导致cpu中断次数变多了,普通任务获得的cpu时间变少了,WaitX()的最大延时变为254毫秒。

2. 为什么要求任务局部变量要求定义为静态变量? 任务内调用的函数是不是局部变量也必须是静态的,任务内调用的子函数内用switch没问题吧
答. 因为任务没有自己的堆栈,释放CPU后再次继续往下运行时,还需要用上次的变量,所以要求定义为静态变量,以便于任务释放CPU后,变量不会
消失。  但是任务内调用的函数(子任务函数除外),是可以用动态局部变量的,也可以用switch。

3. #define WaitX(tickets)   _lc=(unsigned char)(__LINE__)%255U+1U;  if(_lc){return (tickets);}  break; case ((unsigned char)(__LINE__)%255U)+1U:     这个宏定义中为什么去判断 if(_lc),感觉_lc不会等于0啊
答.这里的if(_lc) 纯粹是为了通过Misra C规范检查。如果你的编译器没有选中这个misra c规则检查,也可以去掉这个if判断。
   
4 ...

main进入while(1)循环后,永远不会再有机会去发给flg赋值了。所以需要把赋值部分放到其他地方,最好是放在一个任务里面。
另外,建议main函数里面就是单纯的调用各个RunTask函数,不再判断,要判断可以在任务函数内部去判断。

出0入0汤圆

发表于 2015-6-4 12:35:51 | 显示全部楼层
rundream 发表于 2015-6-4 12:25
1. Ticket能不能选1ms,选1ms会带来什么问题,需要注意哪些
答. Ticket可以选1ms,选1ms最大的区别是:好 ...

首先非常感谢你的回复,其次是由于我把Ticket改为1ms了,有时候为了延时更多的时间,会有连续两条waitx语句,譬如:
waitx(200);
waitx(200);
waitx(200);

对于这个调度器最新的版本这样会有问题吗?谢谢!

出0入0汤圆

发表于 2015-6-4 12:41:54 | 显示全部楼层
zsdshuai 发表于 2015-6-4 12:35
首先非常感谢你的回复,其次是由于我把Ticket改为1ms了,有时候为了延时更多的时间,会有连续两条waitx语 ...

最新版本的调度器,这方面已经改进了:

只要任务函数内部的代码行小于255行的, 可以任意连续多行waitx(当然,也是要小于255行),不会出现重复行了。

出0入0汤圆

发表于 2015-6-4 17:10:03 | 显示全部楼层
看似很厉害的。继续关注。

出0入0汤圆

发表于 2015-6-5 08:52:45 | 显示全部楼层
先收藏,好东西

出0入0汤圆

发表于 2015-6-5 10:56:12 | 显示全部楼层
                        

出0入0汤圆

发表于 2015-6-5 12:23:57 | 显示全部楼层
学习了半天,收获不小

出0入0汤圆

发表于 2015-6-5 13:11:37 | 显示全部楼层
很不错的参列子,收了,顶起来到1000楼

出0入0汤圆

发表于 2015-6-5 14:19:04 | 显示全部楼层
学习了   不错

出0入0汤圆

发表于 2015-6-5 14:32:54 | 显示全部楼层
学习一下!

出0入0汤圆

发表于 2015-7-7 17:17:34 | 显示全部楼层
多谢楼主分享!学习中,写了很多程序从来没考虑过用这个!

出0入0汤圆

发表于 2015-7-7 19:51:09 | 显示全部楼层
记号,学习一下

出0入0汤圆

发表于 2015-7-8 09:32:03 | 显示全部楼层
支持一下,谢谢楼主分享!

出0入0汤圆

发表于 2015-7-20 16:29:07 | 显示全部楼层
精益求精 支持! 如果直接用状态机是不是好点???

出0入0汤圆

发表于 2015-7-20 19:02:26 | 显示全部楼层
mplab x  + xc8  环境  WaitX(30) 报错: constant expression required

出0入0汤圆

发表于 2015-7-28 17:57:08 | 显示全部楼层
顶楼主,这个帖子进行了几年了,楼主还在不停的更新,历害。
再一次谢谢楼主,不过说好的教程呢?

出0入0汤圆

发表于 2015-7-28 18:00:36 | 显示全部楼层
wxlcj 发表于 2015-7-28 17:57
顶楼主,这个帖子进行了几年了,楼主还在不停的更新,历害。
再一次谢谢楼主,不过说好的教程呢?{: ...


你都用于教学了,那教程肯定有现成的。
赶快共享出来!!!

出0入0汤圆

发表于 2015-7-28 20:29:10 | 显示全部楼层
rundream 发表于 2015-7-28 18:00
你都用于教学了,那教程肯定有现成的。
赶快共享出来!!!

说来惭愧,一直没有勇气突破自己,很是惭愧。

出0入0汤圆

发表于 2015-7-28 20:29:22 | 显示全部楼层
看着很高端的样子,虽然不懂,单必须地顶一发。。。

出0入0汤圆

发表于 2015-7-31 18:00:37 | 显示全部楼层
rundream 发表于 2015-7-28 18:00
你都用于教学了,那教程肯定有现成的。
赶快共享出来!!!

为什么在任务中for循环用不起来?我用的是IAR,stm8的片子?

出0入0汤圆

发表于 2015-8-13 00:09:42 | 显示全部楼层
mute 发表于 2014-7-5 07:34
唯一不好的问题就是无法使用内部的临时变量。
如果全改成static,就浪费了很多ram,与这个调度器节省资源的 ...

顶944楼,大牛啊

出0入0汤圆

发表于 2015-9-17 20:04:02 | 显示全部楼层
好东西,收藏了。

出0入0汤圆

发表于 2015-10-8 11:17:46 | 显示全部楼层
学习学习

出0入4汤圆

发表于 2015-11-17 22:22:36 | 显示全部楼层
rundream 发表于 2015-6-4 12:41
最新版本的调度器,这方面已经改进了:

只要任务函数内部的代码行小于255行的, 可以任意连续多行waitx ...

LZ, 如果不用那么极端的精简,比如STM32系列,是否可以直接用PT的word,u16,这样就不必担心行号问题和延时过短。

另外PT里面的条件不仅仅是延时,可以判断其他条件的,你的最新程序里面只有延时的实例,可以写个WaitFlag或者其他的么?

出0入4汤圆

发表于 2015-11-18 10:47:44 | 显示全部楼层

  1. while(TIMEOUT)
  2. {
  3.       WaitX(0);
  4. }
  5. 这种方式有问题.  使用如下方式才行
  6. do
  7. {
  8.      WaitX(0);
  9. }while( TIMEOUT );

  10. 可以把这种方式定义成一个宏:
  11. #define WaitUntil(CondExpr,Cyc)     do { WaitX(Cyc);  }while( !(CondExpr) )
复制代码

除了延时,可以判断其他条件的写法,参照网友回复,不知这个Cyc是不是一定要等于0

出0入4汤圆

发表于 2015-11-18 10:58:32 | 显示全部楼层
在pt中有这个函数,作用是Block and wait until condition is true.,感觉非常好用,楼主能不能在小小的上面加上.

参考pt添加:#define WAIT_UNTIL(condition)  do {_lc=(__LINE__+((__LINE__%256)==0))%256; }while(0); case (__LINE__+((__LINE__%256)==0))%256: if(!(condition)){return 0 ;}

pt中原函数:
#define PT_WAIT_UNTIL(pt, condition)                \
  do {                                                \
    LC_SET((pt)->lc);                                \
    if(!(condition)) {                                \
      return PT_WAITING;                        \
    }                                                \
  } while(0)

出0入0汤圆

发表于 2015-11-18 18:34:08 | 显示全部楼层
[quote]zcan 发表于 2014-7-17 14:56

  1. 要插入的代码片断
  2. [/ code]                        //实际使用时去掉方括号里的那个空格 ...[/quote]
  3. [code]
  4. 天呐我先试试
复制代码

出0入0汤圆

发表于 2015-11-18 19:46:29 | 显示全部楼层
mark学习了,单片机调度器

出0入0汤圆

发表于 2015-11-18 20:02:00 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2015-11-19 16:31:04 | 显示全部楼层
本帖最后由 死神 于 2015-11-19 16:35 编辑

太强了,我要好好学习学习

出0入0汤圆

发表于 2015-11-20 10:49:05 | 显示全部楼层
我一般定义一个long int全局变量 Ftime=0,在50ms定时器中断中Ftime++, 每个任务x都有自己的计时变量Ftimex,Ftime-Ftimex产生的时间差决定是否运行该任务。

出0入0汤圆

发表于 2015-11-21 16:54:18 | 显示全部楼层
期待教程

出0入0汤圆

发表于 2015-11-22 15:25:27 | 显示全部楼层
smset 发表于 2012-12-18 18:29
优化无止境!呵呵,330楼看似不能再优化了,但我再尝试做一次优化:

敬请评测该版本,看是否还能优化:在k ...

以前开发的东西都比较简单  没有考虑过这个方面  现在开发的复杂了  慢慢领会到这个 任务调度是多么的重要
8位单片机还是有市场的  小而精是我开发电子产品追求的目标

出0入0汤圆

发表于 2015-11-23 08:16:44 | 显示全部楼层
哈哈,这个东西好,一直基本都是在使用裸奔程序,试试操作系统!!!

出0入0汤圆

发表于 2015-12-3 17:20:48 | 显示全部楼层
这个调度器花了两个多小时看完了,真是受益匪浅,感谢楼主,感谢所有分享都者!!

出0入0汤圆

发表于 2016-2-2 11:37:53 | 显示全部楼层
#define WaitX(tickets)   _lc=(unsigned char)(__LINE__)%255U+1U;  if(_lc){return (tickets);}  break; case ((unsigned char)(__LINE__)%255U)+1U:
最新个这个在 pic   mplab x + xc8 还是编译不通过  ,提示需要常量   

出0入0汤圆

发表于 2016-2-2 17:31:31 | 显示全部楼层
好东西,收藏了先

出0入0汤圆

发表于 2016-2-3 15:05:25 | 显示全部楼层
smset 发表于 2012-12-7 09:48
子任务嵌套调用可以任意多层的,只要不耗尽整个CPU的RAM公共堆栈就行,每增加一层嵌套,RAM公共堆栈会消耗 ...

楼主你好 我有个疑问就是 在定时器分时间段时 进入某任务 这时串口接收到外部数据 这时软件处理上会有冲突么?

出0入0汤圆

发表于 2016-2-3 20:05:06 | 显示全部楼层
调度器,极小资源单片机值得一用 Mark

出0入0汤圆

发表于 2016-2-4 00:26:03 | 显示全部楼层
又看了一遍。感觉还得看好几遍……

出0入0汤圆

发表于 2016-2-4 01:47:44 | 显示全部楼层
漂亮,先收藏起来!

出0入0汤圆

发表于 2016-2-15 00:25:01 | 显示全部楼层
smset 发表于 2012-12-11 15:05
在211楼版本基础上,增加了信号量SEM, 希望大家验证一下。

257# 引入信号量,一直在寻找信号量的官方实例。

出0入0汤圆

发表于 2016-2-15 00:28:17 | 显示全部楼层
formatme 发表于 2012-12-14 11:45
能加写一个信号量应用的例子吗?我不知道怎么用

你好,弄明白信号量的用法了吗?求共享,谢谢!

出0入4汤圆

发表于 2016-2-28 16:34:30 | 显示全部楼层
以前做的单片机程序都是单任务方式,现在正在研究单片机多任务编程方式,楼主这个帖子对我帮助极大,谢谢了.

出0入0汤圆

发表于 2016-2-28 23:12:08 | 显示全部楼层
楼主确实花了心思的。不需哦。顶一个

出0入0汤圆

发表于 2016-3-30 11:03:58 | 显示全部楼层
好帖!!

出0入0汤圆

发表于 2016-3-31 09:17:57 | 显示全部楼层
这个宏用的好精妙

出0入0汤圆

发表于 2016-3-31 10:04:57 | 显示全部楼层
很好的资料 先收藏了

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-29 10:41

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

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