打印

关于时间片轮询

[复制链接]
5253|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
caoenq|  楼主 | 2017-11-12 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在网上看了一篇关于单片机裸机的时间片轮询架构设计方法,个人感觉很高深(其实就是没看懂),为什么时间片轮询实时性更好呢?也有说该方**使任务(函数)看起来是并行运行的,这就更让我迷糊了。求一些简单易懂的时间片轮询法的资料,或者请大神给讲一讲这其中的设计精髓。(我目前的做法是,对实时性要求不高的,通过定时器定时,每100ms在定时器里置个标志位,在主循环中判断这个标志位来执行相应的任务,即100ms执行一次.而对于实时性要求较高的的任务,我就直接放在主循环中扫描(函数中没有delay等延时函数),而实时性要求更高的任务,就直接用中断了,如串口接收,这种方法算时间片轮询吗?)

相关帖子

沙发
HWM| | 2017-11-12 15:45 | 只看该作者
实时性,这要看你如何界定了。

单就“时间片轮询”而言,只能理解为等时间片轮询,那么到时就轮换询问其它任务。这是没有优先级考虑的平权算法。

使用特权

评论回复
板凳
caoenq|  楼主 | 2017-11-12 20:02 | 只看该作者
HWM 发表于 2017-11-12 15:45
实时性,这要看你如何界定了。

单就“时间片轮询”而言,只能理解为等时间片轮询,那么到时就轮换询问其它 ...

请问大神,可否讲一下什么时间片轮询的架构,就以单片机裸机来说。

使用特权

评论回复
地板
coody| | 2017-11-12 23:49 | 只看该作者
类似于,比如,你有10个MM,每晚陪一个,无差别轮流陪,每个MM给一晚时间,这就是无占先先、无优先级的时间片轮询,任何MM不能打断你当前陪的MM,直到结束。

无占先、有优先级轮询,就是你陪玩一个MM后,下一晚,你看看哪个MM急于要你陪,可能有多个,然后看其排队取舍(队列、FIFO等等)。

有占先的,则及时你正在陪一个MM,但是其中一个更霸道的MM来要你先陪,那么你就得中断跟当前这个MM的亲热,先去处理霸道MM,完事了,回来再继续跟原来这个MM好。

使用特权

评论回复
5
cjseng| | 2017-11-13 00:14 | 只看该作者
我写的程序,大部分是这样的:
定时器产生一个定时,比如5ms,那么所有的任务都放在定时中断里完成,主程序除了上电时初始化一下,啥也不干。至于其它中断,尽可能只做设个标志位,或者把数据放入缓冲区这样的操作,真正的功能都放到定时中断里完成。
这样的好处是:1.相对于在主函数里执行,在定时中断里任务轮训一遍的时间间隔是固定的。最直观的例子是,数码管动态扫描,不会因为任务多少而导致显示不稳定,因为每次刷新的时间间隔是一致的。
2.定时中断结束后,直接让单片机进入休眠状态,等待下一次的中断唤醒,不用一直死等,可以降低功耗,并且可以提高抗干扰性能。

缺点是:写程序时,必须对每一个任务的运行时间仔细测算,确保所有的任务运行一遍不会超过定时器的定时时间。

使用特权

评论回复
6
caoenq|  楼主 | 2017-11-13 12:41 | 只看该作者
coody 发表于 2017-11-12 23:49
类似于,比如,你有10个MM,每晚陪一个,无差别轮流陪,每个MM给一晚时间,这就是无占先先、无优先级的时间 ...

您的发言虽然有悖于社会主义精神文明,但是通俗易懂,鞭辟入里,恰到好处。

使用特权

评论回复
7
caoenq|  楼主 | 2017-11-13 12:45 | 只看该作者
coody 发表于 2017-11-12 23:49
类似于,比如,你有10个MM,每晚陪一个,无差别轮流陪,每个MM给一晚时间,这就是无占先先、无优先级的时间 ...

再请教您个问题,有占先的,是不是只能用中断(并且设置中断优先级)来做?

使用特权

评论回复
8
henglin| | 2017-11-13 15:18 | 只看该作者
Mark

使用特权

评论回复
9
coody| | 2017-11-13 23:41 | 只看该作者
cjseng 发表于 2017-11-13 00:14
我写的程序,大部分是这样的:
定时器产生一个定时,比如5ms,那么所有的任务都放在定时中断里完成,主程序 ...

我的程序跟你的刚好相反。

使用特权

评论回复
10
cjseng| | 2017-11-14 11:14 | 只看该作者
本帖最后由 cjseng 于 2017-11-14 11:15 编辑
coody 发表于 2017-11-13 23:41
我的程序跟你的刚好相反。

我知道你的意思,你用定时器产生一个时标,主程序里检查这个时标,有标志就执行相关的任务,本质上跟我的做法相差不大,只是你没法让芯片进入休眠,要一直查询那个标志。
不知道我说的对不对。本质上,就是不要让CPU使用率达到100%。

使用特权

评论回复
11
gujiamao12345| | 2017-11-14 11:52 | 只看该作者
应该不算
你的应该算前后台
因为时间到了,你还是返回该执行的地方直接执行,并没有执行新的任务...(虽然你设置了新的flag,但是也仅仅在旧的任务执行完之后执行新的任务)
裸机的话,我也一直这么用

使用特权

评论回复
12
gujiamao12345| | 2017-11-14 12:06 | 只看该作者
可能我说的不对,不一定要抢占。
我的理解是每个task都有自己的时间周期,每个时间到了就执行相应的task。
这样就需要把一个定时器用成几个软件定时器。
所以尽量要把task的时间要小于相应时间片的大小。

使用特权

评论回复
13
coody| | 2017-11-14 20:48 | 只看该作者
cjseng 发表于 2017-11-14 11:14
我知道你的意思,你用定时器产生一个时标,主程序里检查这个时标,有标志就执行相关的任务,本质上跟我的 ...

相反,我的主程序每运行一圈就进入IDLE,时隙或中断退出IDLE,面对很多任务,协作非常好,CPU利用率会非常高。

使用特权

评论回复
14
caoenq|  楼主 | 2017-11-15 19:10 | 只看该作者
cjseng 发表于 2017-11-14 11:14
我知道你的意思,你用定时器产生一个时标,主程序里检查这个时标,有标志就执行相关的任务,本质上跟我的 ...

对,我目前是这么做的

使用特权

评论回复
15
雪山飞狐D| | 2017-11-15 19:18 | 只看该作者
最简单的模式就是每个任务都开一个定时器,时间差不重叠就行,以前51做不到,现在M3 很容易就轻松做到,也可以只用systick 做标记

使用特权

评论回复
16
caoenq|  楼主 | 2017-11-17 20:36 | 只看该作者
雪山飞狐D 发表于 2017-11-15 19:18
最简单的模式就是每个任务都开一个定时器,时间差不重叠就行,以前51做不到,现在M3 很容易就轻松做到,也 ...

对于一个工程最好只用一个时基定时器。

使用特权

评论回复
17
wecilau| | 2018-3-6 14:56 | 只看该作者
coody 发表于 2017-11-12 23:49
类似于,比如,你有10个MM,每晚陪一个,无差别轮流陪,每个MM给一晚时间,这就是无占先先、无优先级的时间 ...

请教前后台构架,怎么实现无占先、有优先级轮询?

使用特权

评论回复
18
btz999129| | 2018-3-7 09:35 | 只看该作者
DSZGFDXZG

使用特权

评论回复
19
btz999129| | 2018-3-7 09:35 | 只看该作者
YYYYYGIUIHJ

使用特权

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

本版积分规则

51

主题

1360

帖子

11

粉丝