完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
硬件:stm32f429正点原子开发板 计划实现的功能: 使用can总线发一条数据,收到回复后,就马上再发下一条数据。 发送时先申请互斥量: error_code = rt_mutex_take(&(mcm->mcm_mutex), RT_WAITING_FOREVER); 收到回复时,再释放互斥量: rt_mutex_release(&(mcm->mcm_mutex); 此时遇到一个很奇怪的问题。 当第二次发送时,进入rt_mutex_take函数,此时互斥量的指针运行几句话后会自动变化。 导致本来需要等待互斥量release再发送,结果指向了其他地址,获取到了新的互斥量。 导致提前发送,并发送失败。 请教下,这个可能会是什么原因造成的? |
|
相关推荐
6个回答
|
|
我也使用了canfestival,你的是RTT的软件包的canfestival吗?
你说的发送需要互斥量,在canfestival层面并不需要。 所以你的can驱动是自己写的?还是设备框架驱动的? |
|
|
|
canfestival的发送本身不需要互斥量。
发送时调用writeNetworkDictCallBack(mcm->OD_Data, nodeId, index, subIndex, count, dataType, data, write_sdo_cb, 0); 这个函数不是阻塞的,收到数据时会调用回调函数。 假设希望在最短的时间内发送10条sdo命令。 A方式: 发送第一条 延时 发送第二条 延时 … B方式: 发送第一条(获取互斥量) 等待回调函数处理完(释放互斥量) 发送第二条(获取互斥量) 等待回调函数处理完(释放互斥量) … 因为canfestival的写函数是非阻塞的,如果用A方式发送,那么时间不好确定。所以考虑用B方式。达到收到can数据的回复就开始发送下一条。 |
|
|
|
这个issuse里面已经实现了,你看一下合适不?
跟你B方案描述差不多。 只不过是使用信号量的。 https://github.com/gbcwbz/canfestival-rtt/issues/17 |
|
|
|
换成信号量就可以了。应该是互斥量不能用于不同的线程。
|
|
|
|
&(mcm->mcm_mutex)先排除下这个地址有没有改动吧,是否还指向唯一的互斥结构体
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
590 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2241 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1233 浏览 0 评论
1788 浏览 0 评论
1464 浏览 0 评论
74833 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 06:52 , Processed in 0.701691 second(s), Total 79, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号