打印
[其它应用]

大家对MCU中处理多任务采用时间轮询是怎么看的?

[复制链接]
815|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
songqian17|  楼主 | 2019-2-20 15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主循环结构是这样的:

for (;;)
{
         if (step_start == true)     //  此标记在时间中断服务中 1ms时间标记
         {
                        step_start = false;
                         clear_wdt();                      // 清除看门狗计数器
                         if (step_1ms > 9)
                         {
                                 step_1ms = 0;
                         }
                         switch( step_1ms )      // 时间分成10个1ms 等时间片
                         {
                                  case 0:
                                          
                                        fun_0();
                                          break;
                                          
                                  case 1:
                                          fun_1();
                                          break;
                                          
                                          .
                                          .
                                          
                                          case 9:        
                                           fun_9();        

                                          break;
                                 
                                   default:
                                            fun_0();
                                           break;
                                 
                  
                      }        
                 }
}

大概是这样的一个循环结构,据说是某知名的方案公司统一的程序结构框架,称之谓模块化编程,感觉这个时间轮询写的太Low了,大家对时间轮询有什么看法?
沙发
airwill| | 2019-2-20 21:30 | 只看该作者
我一直**:  能最简单的方式实现功能就是最好的方法

不过往往任务的循环时间不会都一致的, 这样处理就有缺陷了.
有个任务的执行时间长了, 也会影响其他任务, 这也需要考虑

使用特权

评论回复
板凳
songqian17|  楼主 | 2019-2-21 18:16 | 只看该作者
我想时间片轮询应该是把时间作为一个触发事件,哪个时间到被触发执行哪个任务,这里都是搞一个等时间片,CPU执行效率很差,或者是基于状态机的触发方法,有没有人对时间片的轮询有独立见解的?

使用特权

评论回复
地板
songqian17|  楼主 | 2019-2-21 18:20 | 只看该作者
if (step_1ms > 9)
{
      step_1ms = 0;
  }

上面这个地方写错了,应该是

if(++step_1ms > 9)
{
    step_1ms = 0;
}

使用特权

评论回复
5
songqian17|  楼主 | 2019-2-21 18:22 | 只看该作者

自己顶。。。。。。。。。。。。。。。。。。。
有没有高手 ???

使用特权

评论回复
6
congfenglong| | 2019-3-12 13:29 | 只看该作者
上面给你回复的不是高手吗?不过现在这样用的不多吧?反正如果是对时间要求没有这么精确的这么做是可以的,像如果是时间要求高的场合,中断里做的任务都够多的了,主函数这样做,可能后面9ms的任务得好几秒钟才执行一次,多坑

使用特权

评论回复
7
ayb_ice| | 2019-3-20 10:29 | 只看该作者
建议主循环设置为10~100MS轮询一遍,多余的时间进入IDLE,如果不够,立刻进入下一循环,下一循环有多余时间,将上一循环超出的时间追回,这样从长时间角度看,是没有累计误差的,
轮询的每个任务根据各自的时间标志处理自己的事情,有实时要求的任务通过中断处理,这样所有被轮询的任务是公平的,相互之间也不会冲突,容易传递消息,配合状态机轻松解决各种问题,一般禁止被轮询的任务长时间占用CPU,特别是经常长时间占用,偶尔长时间占用则是允许的

使用特权

评论回复
8
condition| | 2019-3-26 14:32 | 只看该作者
这个要是灵活应用起来,还是可以的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

463

主题

5749

帖子

1

粉丝