gbcwbz / canfestival-rtt

A CanFestival port to RT-Thread operating system
GNU Lesser General Public License v2.1
53 stars 31 forks source link

使用过程中互斥锁出现不释放的情况 #15

Closed yangbo18416 closed 2 years ago

yangbo18416 commented 2 years ago

我目前使用的定时器是定时器2,定时模式修改了为循环模式。偶尔出现如下错误: 故障提示如下: Snipaste_2022-10-11_16-07-41 互斥量占用情况,定时器程序占用未释放 2 线程情况 3 不知道作者有没有遇到类似的情况呢?

gbcwbz commented 2 years ago
yangbo18416 commented 2 years ago

返回-1是出错了,我截图中显示互斥量被定时器的那个线程给占用了。然后其他地方的调用互斥锁就是在can驱动内。提示-1的原因我分析是获取互斥锁您的源程序内是超时处理,当can接收线程需要调用互斥锁时,由于定时器线程没释放,然后can驱动进行释放。此时因为线程不是上锁的线程,所以就报这个错误。我改成了ONE_SHOT类型,还是会出现这样的情况。

gbcwbz commented 2 years ago

你把 cf_timer 和 cf_recv 线程的优先级调成不一样试试, cf_timer 应该不会一直持有 mutex 的,除非 TimeDispatch 占用了太多时间

yangbo18416 commented 2 years ago

我设置了优先级不同,但是占用互斥量时会,cf_recv的优先级高于cf_timer,然后出问题的时候cf_timer的优先级会被提升到和cf_recv。出问题后我打断电,cf_timer的循环已经卡死了。从状态来看是suspend了

gbcwbz commented 2 years ago

是不是在canfestival的回调里面做了太多事情,或者使用了mutex,导致suspend了?

yangbo18416 commented 2 years ago

回调里使用到了mutex的情况应该就是初始化时配置SDO用到了,其他地方我没看到有用到。非常感谢您的耐心解答,我这边再找找原因或找一下其他的解决办法!!

yangbo18416 commented 2 years ago

忘记补充个条件了。这个出现的情况是我突然把某个从机下线(人为拔掉通讯线)后,短时间内插上不会报错。若超过一定时间,则出现获取失败的情况

yangbo18416 commented 2 years ago

在查找问题过程中,在配置驱动器函数内有加锁操作。正常情况这个配置驱动器在上电就完成了,但是一旦有设备离线,再上线时,会调用回调函数slaveBootupHdl,回调函数里会再次调用config_servo 这个函数。这样可能就存在您上述提到的回到函数里使用了mutex操作。我在config_servo函数内删掉上锁代码后,目前设备一切工作正常,从机下线(拔掉通讯线)再次上电系统也工作正常。 image

gbcwbz commented 2 years ago

其实只要保证同时只有一个线程在配置同一个伺服就好了,有时间欢迎 PR

wdfk-prog commented 2 years ago

其实有多种情况

可以判断到掉线了,进行处理的。 你这个是节点掉线了,要分情况处理。一般我都是先把MCU转到STOP状态再查询节点状态是否发送改变。改变了就算上线了

yangbo18416 commented 2 years ago

之前说已经解决了,后来再次测试时仍然发现了这个情况。后来在论坛搜索发现可能时can驱动在处理时可能存在问题,后来将RT版本升级到4.1.1版本(该版本解决了can的bug)后多从测试均正常。 https://github.com/RT-Thread/rt-thread/pull/5915