我看了“中断驱动多任务”的帖子,考虑这种关于TDMA的程序设计,有些问题不大明白。
既然采用了定时器中断充当时间片,在传统的中断ISR中置标志位,主程序进行状态机的判断和调度,我想结合二者进行了改进。
1.中断还是干着以前的事情,进行标识。
2.但起tick作用的定时器干什么呢?
既然主程序中进行标识位的检测,那么定时器的作用似乎有些累赘。不知道我的理解在哪方面有什么偏差。主程序和定时器(时间片的关系)功能有点矛盾。
因为在中断驱动多任务的文章中,定时器里面进行任务调度,主程序IDLE,这样的话主程序似乎有点浪费MCU的资源,如果在主程序中查询标志,那么要定时干嘛呢?难道定时去查看其他中断标志好了没有?
谢谢
最后借这个帖 感谢下shuiyan
尽管以前做的单片机产品中一直这样做的,但实际所说的只是最简单的一种处理方式,也是偷懒的做法。“时间片”机制其实远没有这么简陋的,有兴趣从ucOSII开始看起,然后看《自己动手写操作系统》,然后就可以考虑自己写个出来,非常有效的。
主程序IDLE不是浪费MCU资源,而是节省资源,降低功耗。因为主程序是顺序执行,一旦动起来,就不会停,MCU会一直跑的,即使没有任务的时候也会在全功耗模式消耗能量,而且靠主程序来分配各任务的执行顺序是很不可靠的。所以才有IDLE的处理。
互相交流,做多了自然会懂的。每个人都是这么走过来的。
ls说得非常在理 学习不是一两天的事情,而是一个循序渐进的过程
当然 TDMA是没有这么简陋,呵呵。可能也是没有见过关于TDMA方面的例子,所以思维受到那篇文章的局限。
我认为主程序while(1)中或多或少应该干些事情 否则光靠在一个tick中做的事情应该不够的
举个例子 如果tick为5ms 一则消息来了 处理时间也许需要很长时间(15ms) 也许我们可以降低这个处理时间 但是主程序必须是过5n个周期才能处理(如果还有别的中断处于空闲状态) 那么主程序干些事情会对降低整个时延起到比较大的作用……
所以我才说主程序IDLE浪费MCU……呵呵
主程序IDLE难道是让单片机进入睡眠状态?降低功耗?
状态机由时间片判断,延时由时间片实现。具体做的事情如果长,那么还是由while里面来做比较合适,前提是这段事情必须能允许中断打断的。
基本MCU无法使用IDLE切换状态的功能,不过这是个设计理念,尤其针对有多个内部设备控制器、多个工作状态的cpu/mcu,IDLE时可以根据状态机,分别关闭某些控制器,或者切换自身的工作状态。操作系统其实就是这么干的。
如果在主程序中查询标志,那么要定时干嘛呢?难道定时去查看其他中断标志好了没有?
//
不是什么事都能在中断里做完了
而且,有些高优先级的中断是不再允许中断了的
这样的话,会对别的外设的响应变慢
放标志的方式
相当于,提交一个消息
由你的调度内核去权衡倒底应该先执行哪个响应
而不是听你的外设的
比如造成优先级反转,那是很郁闷的事
多任务里定时器的作用是切换任务,并且这些任务并不都是中断的,或者是中断的后续处理的,
如果你所有的任务,都是跟中断有关的,那定时器切换也就没有意义了,直接中断置位,然后主程序处理了
其实定时器时间片在单片机初期使用时,最显著的一个作用是:延时。
不一定是需要非常“精确”的延时,而是为了避免for(i=0;i<1000;i++)这样最粗陋的实现方式。
比如:按键的延时去抖,10mS,就不可能在按键中断里做,那么定时器就有用了。1mS的定时器触发10次就行。随后在主程序里根据一个标志量来判断按键是否还有效。
至于在多任务设计中,时间片的作用就更重要了。可以说整个多任务操作系统的实现基础就是这个了。