搜索
bottom↓
回复: 56

为什么RTOS系统时钟都是1毫秒?可以调到0.1毫秒不?

[复制链接]

出0入0汤圆

发表于 2016-8-3 15:01:26 | 显示全部楼层 |阅读模式
如题,为什么RTOS系统时钟都是1毫秒?可以调到0.1毫秒不?
有些强实时性的应用,把系统时钟调快,采用查询方式可以减少很多外围硬件中断,反而提高系统效率

出0入0汤圆

发表于 2016-8-3 15:05:36 | 显示全部楼层
没看过RTOS的底层,但是如果指望着用查询替代硬件中断基本就别想了,
很多情况的中断不方便代替。

不过我相信底层肯定有低于1ms的时钟信号,你可以查一下。没有理由只给1ms那么长的

出0入0汤圆

 楼主| 发表于 2016-8-3 15:08:10 | 显示全部楼层
severewinner 发表于 2016-8-3 15:05
没看过RTOS的底层,但是如果指望着用查询替代硬件中断基本就别想了,
很多情况的中断不方便代替。


可以改的,就是有没有必要改,探讨

出20入70汤圆

发表于 2016-8-3 15:14:19 | 显示全部楼层
何止1ms,1us的系统时钟都可以,只要你的系统够快能跑的过来!
实时性和系统时钟并不是一对一的关系,好的任务安排和中断响应才是写好实时性任务的关键!
建议还是看看中断和查询的区别吧!

出0入0汤圆

发表于 2016-8-3 15:14:55 | 显示全部楼层
kaomantou 发表于 2016-8-3 15:08
可以改的,就是有没有必要改,探讨

当然可以改啊,而且随便改。
现在随便个哦芯片都是8M以上。改成us都不是问题。
不知道RTOS有没有驱动或者计算时候用到读时间,这样你改系统时间这些地方都受到影响。

不过我不建议把硬件中断改成查询。很多快速信号抓不到。
但是有些情况,比如干扰比较大我的道是建议用查询,免得总中断耽误时间。

出0入0汤圆

发表于 2016-8-3 15:19:30 | 显示全部楼层
可以,出入栈的开销太大了

出0入0汤圆

发表于 2016-8-3 15:21:49 | 显示全部楼层
看的是总体效率,自己定

出0入0汤圆

发表于 2016-8-3 15:24:23 | 显示全部楼层
频繁的任务切换这就加大了CPU的负担呀~!

出0入0汤圆

 楼主| 发表于 2016-8-3 15:28:29 | 显示全部楼层
tangnyzl 发表于 2016-8-3 15:19
可以,出入栈的开销太大了

有些情况,可能比响应中断经济

出0入0汤圆

发表于 2016-8-3 15:59:52 | 显示全部楼层
觉得更该做的是优化任务, 考虑用时间片还是抢占.

出0入8汤圆

发表于 2016-8-3 16:06:09 | 显示全部楼层
理论上可以调快,但实际上,要注意 RTOS 的内核或者组件,有没有受影响(有一些假设了 tick 的最小时间为 1ms 这个前提的)
1ms 是一个工程经验实践值,大家都这么用,我也这么用(足以满足多数情况)。

不过将 tick 加快下去,直接影响是:带来了功耗的更多开销,
如果你加入 tickless 机制的话,那么这点可以忽略。

不过话说回来,强实时性的东西,还是依赖中断可靠些。

出0入0汤圆

发表于 2016-8-3 16:26:26 | 显示全部楼层
任务调度本身就是中断调用的,

加快10倍tick  ,调度开销变大

还不如tick不变,仅仅把实时任务通过硬件中断处理

出0入34汤圆

发表于 2016-8-3 16:45:51 | 显示全部楼层
这完成是可以的,在考虑出入栈所要用的时间外,想办法加快处理器本身的速度与时脉会要来得更好些。

出0入46汤圆

发表于 2016-8-3 16:47:45 | 显示全部楼层
效率、性能的一个平衡

出0入12汤圆

发表于 2016-8-3 17:10:38 | 显示全部楼层
吞吐量下降,因为 1 秒钟里面处理时钟中断的次数变多了。

出0入0汤圆

发表于 2016-8-3 17:23:49 | 显示全部楼层
看了楼上都是在评论

难道就没有人说出在哪改吗?对了 楼主是用的哪款RTOS 知道在哪改不

出0入0汤圆

发表于 2016-8-3 17:32:26 | 显示全部楼层
ywlzh 发表于 2016-8-3 17:23
看了楼上都是在评论

难道就没有人说出在哪改吗?对了 楼主是用的哪款RTOS 知道在哪改不 ...

就改一些宏定义,还需要说在哪里改吗

出0入8汤圆

发表于 2016-8-3 17:35:24 | 显示全部楼层
ywlzh 发表于 2016-8-3 17:23
看了楼上都是在评论

难道就没有人说出在哪改吗?对了 楼主是用的哪款RTOS 知道在哪改不 ...

在哪里改是次要的
这个因 RTOS 而异,你需要针对具体的 RTOS,去看相关文档
举个例子,
µC/OS 是通过 OS_CFG_TICK_RATE_HZ 来调整
RT-Thread 是通过 RT_TICK_PER_SECOND 来调整

出0入0汤圆

发表于 2016-8-3 17:59:24 来自手机 | 显示全部楼层
太低了,死机

出0入0汤圆

发表于 2016-8-3 18:07:32 | 显示全部楼层
楼主根本不会使用OS,中断和查询方式不是这样使用的。
ucos中,中断响应后的数据,可以用信号量抛给任务去执行。并且是可以预测间隔响应时间的,可以停止调度器运行,可以停止其它中断打断。完全根据你的强实时性的次序。
查询方式虽然代码容易理解,编写顺序方便。但查询的周期非常不确定,被不确定的分支占用。如果开定时器严格查询,那么查询到的数据,只能等到被打断的代码运行完成并查询到这个新数据才能响应这个动作。打断的位置根本无法确定?如何谈你的强实时。

出0入4汤圆

发表于 2016-8-3 18:31:16 来自手机 | 显示全部楼层
是要累死CPUm么?

出0入0汤圆

 楼主| 发表于 2016-8-3 18:48:11 | 显示全部楼层
shian0551 发表于 2016-8-3 18:07
楼主根本不会使用OS,中断和查询方式不是这样使用的。
ucos中,中断响应后的数据,可以用信号量抛给任务去 ...

可能强实时的定义有区别。

我举个栗子,大家讨论一下:

有三个串口接收,都是115200的bps,帧结束条件都是间隔3.5t,但要求不高,3也可以4也可以(甚至可以更宽松),如果每个byte都中断接收的话,总的中断频率在30k以上。
为了降低中断频率,这时候全部改成DMA接收,如果用任务查询的方式,查询DMA状态,如果没有新数据收到,且维持几个系统周期,就判断一帧结束,这样系统开销只有的任务切换开销
和DMA的中断开销(也可以不中断),综上系统时钟10k,那就可以替代30k的中断频率

出300入477汤圆

发表于 2016-8-3 19:13:11 来自手机 | 显示全部楼层
kaomantou 发表于 2016-8-3 18:48
可能强实时的定义有区别。

我举个栗子,大家讨论一下:

正确做法是用定时器中断去查dma,不是用个任务定时去查。

出0入0汤圆

发表于 2016-8-3 19:17:33 | 显示全部楼层
我也有楼主这个疑问,目前对OS理解不是很透彻,当前的理解是可以减小,但是最小时钟周期最好大于所有任务中运行时间的最长值。
比如所有任务中运行时间最长值是475us,那么系统时钟就可以设置为500us。
等以后对os有更好理解时说不定会有其他看法。

出0入0汤圆

发表于 2016-8-3 19:17:42 | 显示全部楼层
kaomantou 发表于 2016-8-3 18:48
可能强实时的定义有区别。

我举个栗子,大家讨论一下:

这是DMA的优点

跟系统tick 毫无关系

串口不用DMA的话,就用中断接收,

难道不用中断,通过加快系统tick来查询接收?

出300入477汤圆

发表于 2016-8-3 20:09:09 来自手机 | 显示全部楼层
Magicfjpg 发表于 2016-8-3 19:17
这是DMA的优点

跟系统tick 毫无关系

定时去查dma就行了,这是要严格的若干时间空闲作为帧结尾的最简单的做法。

出100入101汤圆

发表于 2016-8-3 22:51:52 | 显示全部楼层
1ms,已经够快了。

出0入0汤圆

发表于 2016-8-3 23:20:47 | 显示全部楼层
并行,多通道,多模块,分而治之。
低cpu占有率,保证系统运行流畅。
数据效验,错误处理,保证系统安全可靠。

出0入0汤圆

 楼主| 发表于 2016-8-3 23:57:35 | 显示全部楼层
redroof 发表于 2016-8-3 20:09
定时去查dma就行了,这是要严格的若干时间空闲作为帧结尾的最简单的做法。
...

如果系统时钟分辨率够高,就没必要再开定时中断了,我的意思是综合考虑降低CPU负担

出0入0汤圆

发表于 2016-8-4 00:09:22 | 显示全部楼层
kaomantou 发表于 2016-8-3 23:57
如果系统时钟分辨率够高,就没必要再开定时中断了,我的意思是综合考虑降低CPU负担 ...

我不知道你用什么MCU,72Mhz的STM32,你搞0.1ms,估计大部分时间在跑os上下文的代码,应用效率很低的。
我一般都定10ms切换,实时都是中断抛信号量,事件等直接切换任务处理的。时间是可控。

出0入0汤圆

发表于 2016-8-4 07:14:50 | 显示全部楼层
RTOS不全部都是1ms哦,这个可以修改的.0.1ms太快了,还是用中断来的方便。

出0入0汤圆

发表于 2016-8-4 08:43:06 | 显示全部楼层
redroof 发表于 2016-8-3 19:13
正确做法是用定时器中断去查dma,不是用个任务定时去查。

一般不是用完成中断(可以使接收完成中断或DMA完成中断)然后加同步信号量吗?

出0入0汤圆

发表于 2016-8-4 08:47:44 | 显示全部楼层
也疑惑过这个问题,不过都说效率低就算了,还有建议改成10ms的。

出0入0汤圆

发表于 2016-8-4 08:52:12 | 显示全部楼层
在于一般的应用估计是设置成 10ms 是最多的。

出0入0汤圆

发表于 2016-8-4 08:54:54 | 显示全部楼层
xjavr 发表于 2016-8-4 00:09
我不知道你用什么MCU,72Mhz的STM32,你搞0.1ms,估计大部分时间在跑os上下文的代码,应用效率很低的。
我 ...

同意

我认为楼主根本就不懂什么叫RTOS.

出0入8汤圆

发表于 2016-8-4 08:58:16 | 显示全部楼层
xjavr 发表于 2016-8-4 00:09
我不知道你用什么MCU,72Mhz的STM32,你搞0.1ms,估计大部分时间在跑os上下文的代码,应用效率很低的。
我 ...

从理论上来讲:
没有更高优先级线程就绪的话,OS 上下文切换,还是要等到时间片耗尽,才会发生,一般来说,时间片不能随着 tick 调整而变化
因此大部分时间在跑 系统时钟的 ISR。

出0入4汤圆

发表于 2016-8-4 09:03:56 | 显示全部楼层
改的太小,发现你的mcu大部分时间就是在切换任务去了,实时性可能会更低

出0入0汤圆

发表于 2016-8-4 09:14:47 | 显示全部楼层
同楼上其他人,我也用100Hz的时基,满足我全部需求。
22楼串口DMA的举例,配合硬件接收(RTOR)超时,很好解决。

出0入0汤圆

发表于 2016-8-4 09:46:44 | 显示全部楼层
好贴留名,大家继续讨论

出0入59汤圆

发表于 2016-8-4 10:24:44 | 显示全部楼层
针对串口情况
有些芯片的串口DMA(如atmel 的ARM)自身就具备硬件超时功能,直接用硬件超时中断
另外一些(如STM32)不具备硬件超时功能,需要用软件间期查询

出0入0汤圆

发表于 2016-8-4 10:53:34 | 显示全部楼层
我试过,基本跑不动

出0入0汤圆

发表于 2016-8-4 11:10:52 | 显示全部楼层
可以调,但是这样做的好处?

出300入477汤圆

发表于 2016-8-4 11:11:27 | 显示全部楼层
dykwai1 发表于 2016-8-4 10:24
针对串口情况
有些芯片的串口DMA(如atmel 的ARM)自身就具备硬件超时功能,直接用硬件超时中断
另外一些( ...

对,STM32没有硬超时,所以只能用个定时器去查询DMA看看是不是到了超时时间(如果要严格的多长时间不收到数据算超时的话)

出0入0汤圆

发表于 2016-8-4 11:20:53 | 显示全部楼层
这个问题,我也有点困惑. 尤其在做红外遥控解码的时候.
当时,试了很多方法不好使, 在网上看到一个125us中断的程序,很好使!

出0入0汤圆

发表于 2016-8-4 13:55:00 | 显示全部楼层
我觉得没有必要这么做
原因是开销太大
如果你的有这么高开销的任务  建议单独拿出一个定时器 定时器中完成任务
如果查询外部中断为什么不用 自带的中断

出0入0汤圆

 楼主| 发表于 2016-8-4 14:13:02 | 显示全部楼层
Magicfjpg 发表于 2016-8-3 19:17
这是DMA的优点

跟系统tick 毫无关系

你多读几遍我写的问题,我怎么觉得你的回复和我说的不是一个事情?

出0入0汤圆

 楼主| 发表于 2016-8-4 14:15:22 | 显示全部楼层
redroof 发表于 2016-8-3 19:13
正确做法是用定时器中断去查dma,不是用个任务定时去查。

10k的定时器中断,加上一个1k的系统切换中断?

出0入0汤圆

 楼主| 发表于 2016-8-4 14:15:52 | 显示全部楼层
redroof 发表于 2016-8-4 11:11
对,STM32没有硬超时,所以只能用个定时器去查询DMA看看是不是到了超时时间(如果要严格的多长时间不收到 ...

这坛子不就是stm的么?

出300入477汤圆

发表于 2016-8-4 14:27:41 | 显示全部楼层
kaomantou 发表于 2016-8-4 14:15
10k的定时器中断,加上一个1k的系统切换中断?

定时器中断的时间应当是一个字节的时间,这个中断里面平常只需要几行,就是检查串口DMA有没多收到一个数据。
如果跟上次相比没收到数据就把空闲时间加1,如果收到了数据就把空闲时间清零。
等空闲时间到了4个字节,就表示真的这一帧收完了,可以处理了。这个时候从中断里面发送一个信号,唤醒处理数据的任务即可。
操作系统的时间片是多少根本不重要。因为从中断里面发送信号来唤醒处理线程这个过程根本就不依赖操作系统的时间片!

出300入477汤圆

发表于 2016-8-4 14:33:15 | 显示全部楼层
security 发表于 2016-8-4 08:58
从理论上来讲:
没有更高优先级线程就绪的话,OS 上下文切换,还是要等到时间片耗尽,才会发生,一般来说 ...

正常的完全抢占的实时系统,基本上不怎么靠时间片切换。
正在运行中的任务挂起了主要是等待信号量,而它等待的这个信号量由另外一个任务或者中断函数来发送。这样就行了。
这种做法可以轻松的得到微秒级的响应速度,跟操作系统的时间片无关。
多个任务靠Sleep来挂起让别人执行是很笨的做法。

出0入0汤圆

发表于 2016-8-4 15:29:11 | 显示全部楼层
我都开10mS,你想过MCU频繁切换任务的开销吗

出20入186汤圆

发表于 2016-8-4 15:44:41 | 显示全部楼层
中断快了某些开销太大,不化算的,

出0入8汤圆

发表于 2016-8-4 15:48:19 | 显示全部楼层
redroof 发表于 2016-8-4 14:33
正常的完全抢占的实时系统,基本上不怎么靠时间片切换。
正在运行中的任务挂起了主要是等待信号量,而它 ...

是的,这是正确的处理方式:
平时处于空闲,有事才起身处理一下,
这里的有事,指的是靠内核同对象触发,或者自己 sleep 醒来,多数都是靠内核同对象触发。

换句话说:平时基本就只有 idle_thread 活跃到没朋友,
自己跟自己玩,自己数着自己的时间片,只不过时间片耗尽,还是自己来玩就是了(此时也不需要切换上下文),
而如果加入 tickless 机制的话,此时 idle_thread 也会睡下去的。

出0入8汤圆

发表于 2016-8-4 16:23:26 | 显示全部楼层
kaomantou 发表于 2016-8-4 14:15
10k的定时器中断,加上一个1k的系统切换中断?

你或许可以了解一下这个概念:
对于 RTOS 而言:
中断退出时,如果当前线程,不等于最高优先级、就绪的线程时,RTOS 需要立即切换一次上下文,切到最高优先级的线程,
这是 RTOS 的 RT 的一个关键支撑点。

出0入0汤圆

发表于 2016-8-4 17:06:09 | 显示全部楼层
估计时间都花在任务切换上了

出300入477汤圆

发表于 2016-8-4 18:28:22 | 显示全部楼层
security 发表于 2016-8-4 16:23
你或许可以了解一下这个概念:
对于 RTOS 而言:
中断退出时,如果当前线程,不等于最高优先级、就绪的线 ...

为了节约时间,你可以在明知道没发送任何信号量的中断里面不检查任务切换。因为只有发出信号量才可能改变当前就绪的任务。
比如上面的用定时中断来算串口空闲时间,那么明知道串口空闲时间没到就可以直接退出中断。
只有时间到了,你发出了信号量,然后在退出中断之前才需要执行RTOS的检查函数。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-5 19:58

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

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