5 modbusRTU如何避免因为被高优先级任务切走而导致本次通讯失败

发布于 2020-08-06 19:03:11

我的一个串口上挂了5个RTU从设备。MODBUSTCP每15S要一次数据,其优先级比rtu采集线程高.
监控日志发现,很多个周期会有一个一个周期中的某个从设置通讯失败。上位机根据数值绘制曲线,他们一方面追求采集速度,另一方面不允许有rtu通讯失败的情况,因为他们先根据rtu通讯成功状态之后利用数据绘图,如果失败就不描点绘图。
我不能用进入和推出临界区的方法对通讯的一个函数调用进行保护,否则全部通讯失败。因为该modbus库可能还有其它线程。
那么这种情况下如何才能避免因为低优先级的任务函数被高优先级线程切走导致的通讯失败?

查看更多

关注者
0
被浏览
176
2 个回答
CrisJay
CrisJay 认证专家 2020-08-07

首先得弄清楚通讯失败的本质是什么,也就是到底是哪个处理导致的RTU通讯失败,如题主描述的被高优先级任务切走这个机制本身并不会导致通讯的失败,如果题主能够定位本质问题的话也就能提供对应的解决方案了。

杰瑞鼠
杰瑞鼠 2020-08-21

摘录自《嵌入式系统优先级讲解》
而在操作系统中,为了保护那些全局变量,禁止中断的操作时有发生,那么是否有一种方法可以屏蔽部分中断,而让高优先级的中断不被屏蔽呢?

有的,在 Cortex-M3 内核中,有一个寄存器专门干这事,即 BASEPRI。
当设置该寄存器时,将屏蔽所有优先级不高于某个具体值的中断。
比如设置该寄存器为 3,那么优先级0~ 2的中断不会被屏蔽。
所以在操作系统中,我们可以修改禁止中断的代码,使其不会屏蔽高优先级的中断,对于高优先级中断来说,可增加实时性。
uCOS II 中默认是直接全局禁止中断的(可以修改它),但是 FreeRTOS 是可以禁止部分中断的,使用的就是上述寄存器,当然这个功能需要单片机本身支持才行

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友