完善资料让更多小伙伴认识你,还能领取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)先排除下这个地址有没有改动吧,是否还指向唯一的互斥结构体
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
788 浏览 0 评论
4271 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2529 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2929 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31479 浏览 11 评论
72924 浏览 21 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 16:56 , Processed in 0.814574 second(s), Total 81, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号