嵌入式技术论坛
直播中

张敏

7年用户 1525经验值
私信 关注
[经验]

怎么去解决RT-Thread中的CANfestival存在的BUG呢

RT_Thread中的CANfestival存在的BUG
问题描述:假设某个从机的ID为3,当从机第一次接入的CAN网络中的时候,主机会将该ID的从机进行初始化,当该从机由于某些故障退出网络再接入网络之后,主机会卡死,串口的输出如下图所示。

错误分析:这是因为从机第一次接入网络的时候会调用OD_Data->post_SlaveBootup函数(slaveBootupHdl被赋值给OD_Data->post_SlaveBootup),在slaveBootupHdl函数中会创建任务config_single_servo,该任务会调用函数config_servo(nodeId),该函数如下图所示。

问题就出现在图中画出来的代码。在第一次接入的时候,由于finish_sem没有初始化,从而初始化的时候没有问题。在该从机由于故障被切除再接入CAN网络的时候,从机会发送上线命令,导致主机调用slaveBootupHdl函数,从而会再次初始化finish_sem。由于finish_sem以及被初始化了,从而在rt_sem_init()->rt_object_init()中进入RT_ASSERT()断言,如下图所示。

解决方法:在config_servo(nodeId)函数的最后添加一句rt_object_detach(&(servo_conf[nodeId - 2].finish_sem)),如下图所示。

原作者:『“理想”』

更多回帖

发帖
×
20
完善资料,
赚取积分