Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
ericQiang opened this issue Apr 13, 2017 · 3 comments

Comments

@ericQiang
Copy link
Contributor

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

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

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

@armink
Copy link
Owner

armink commented Apr 13, 2017

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

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

@ericQiang
Copy link
Contributor Author

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

@armink
Copy link
Owner

armink commented Mar 29, 2018

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants