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)),如下图所示。
原作者:『“理想”』
|