各位大佬,CAN正常通讯过程中,会偶尔出现程序阻塞在rt_completion_wait这个函数里面,用调试下断点后,发现是在can发送消息时,程序进入了RT_ASSERT(rt_list_isempty(&(completion->suspended_list)))这个断言,不太明白为什么会出现这种情况,请遇到过类似情况或者有一些猜测的同学给一点建议,多谢。
rt_completion_wait
RT_ASSERT(rt_list_isempty(&(completion->suspended_list)))
查看更多
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/completion/completion
可以阅读一下这篇文档,看是否对你有帮助!
RTT V5.1 + AT32F435can配置收发中断,同样也是发送挂起在这个wait completion
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
简单来说,该wait最好别在多个线程中使用,因为在多个线程中使用时,可以会出现两次调用该函数,就会发生异常
@chenyingchun 你好,根据这篇文档和源码,我理解CAN发送数据后会调用rt_completion_wait等待本次发送结果,本次发送完成后,应该会有一个CAN中断调用rt_completion_done让发送线程结束等待,这样循环下来完成所有数据的发送。但是目前现象是CAN发送数据后,并没有产生CAN中断调用rt_completion_done,导致发送线程一直阻塞在completion上,后续其他的线程再想挂在相同的completion上就报断言了,不知道有哪些情况会导致CAN中断产生失败呢
你好,CAN本身相关的,我就不是特别了解了哈,completion文档是我写的,我大概连接completion本身的一些问题
@chenyingchun 好的,多谢
@chenyingchun 你好,我仿真调试的时候,当rt_completion_done被调用,被阻塞线程恢复后,出现了completion->suspended_list的值未清空的情况,导致后面线程再调用rt_completion_wait时,就判断其suspended_list上已有阻塞对象,进入assert了,不知你是否了解哪些因素会导致这种情况出现呢?
这确实是一个问题,不知道你们用好方法解决的!
@will_fang
nijiejuelema qin请教一下
该bug在STM32的CAN驱动有修复了.
可以参考一下是不是这个问题导致的
@will_fang
你好,请问这个问题解决了吗