FreeModbus_Slave-Master-RTT-STM32 icon indicating copy to clipboard operation
FreeModbus_Slave-Master-RTT-STM32 copied to clipboard

本工程线程SystemMonitor在调用eMBMasterReqxxx函数前,必须要调用 rt_thread_delay?

Open ericQiang opened this issue 8 years ago • 3 comments

仓主,SystemMonitor线程在调用eMBMasterReqxxx函数前,必须要调用 rt_thread_delay吗?我在测试时,遇到的问题时,如果没有调用rt_thread_delay的话,线程就卡死了。不知道仓主有没有测试到这个问题。

仓主回答: @ericQiang 你要等待 Modbus Poll 线程里面 MB_init 初始化成功,才能调用 modbus 相关的 API。

但目前masterPoll线程优先级最高,不存在MB_init初始化失败的情况。并且,我在初始化SystemMonitor线程时将延时设置为200.但问题依然会复现。仓主可否将你提交的工程中,SystemMonitor线程中的几个与rt_thread_delay屏蔽掉测试一下? 谢谢。

ericQiang avatar Apr 13 '17 01:04 ericQiang

应该是因为 T35 定时器初始化还没有完成,此时发起主机请求,导致状态机混乱,最终形成死锁。T35 本身时间很短,所以之前一直没有注意到这个细节。

不过出于可靠性角度考虑,我觉得问题还是要修复的,只通过让用户延时规避问题,有点不太妥。你有没有相关建议?

armink avatar Apr 13 '17 02:04 armink

有个提议,在eMBMasterPoll函数中swith修改如下: switch ( eEvent ) { case EV_MASTER_READY: //flag eMBMasterPoll, eg. add another state ESTABLISHED break; } 经测试可行。全部修改diff如下: diff3.txt

ericQiang avatar Mar 29 '18 05:03 ericQiang

多个状态确实可以解决问题。本地多测试下,可以提交 pr

armink avatar Mar 29 '18 08:03 armink