1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
工作中看同事的代码,他在一个线程A中
1、先获取、释放互斥量: rt_mutex_take (ble_mutex, RT_WAItiNG_FOREVER); / 返回-8 / 操作共享资源 rt_mutex_release(ble_mutex); 2、再去创建互斥量:ble_mutex = rt_mutex_create ("bleMutex", RT_IPC_FLAG_FIFO); 结果发现共享资源操作结果是正确的。 注:rt_mutex_t ble_mutex = RT_NULL;/ 全局变量 / 我的疑问: 1、获取不到互斥量,线程不应该挂起吗,为何还能执行操作共享资源,并且结果还是正确的? 2、假设我只有一个线程A,没有其他线程,那按上述流程互斥量是不是不会导致线程A挂起? |
|
相关推荐
2个回答
|
|
信号量没有初始化时,按照你的定义为 RT_NULL,这个状态下根据源码(如下所示)获取信号量会触发断言错误的。这个时候就要看你下你的代码断言错误是怎么处理的,或者是不是真的没有初始化信号量,建议单步调试一下看看是哪一种情况。
获取信号量的代码: rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time) { register rt_base_t temp; struct rt_thread *thread; /* parameter check */ RT_ASSERT(sem != RT_NULL); // 断言 RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore); ... ... // 省略 } 断言错误处理的代码 #define RT_ASSERT(EX) if (!(EX)) { rt_assert_handler(#EX, __FUNCTION__, __LINE__); } |
|
|
|
rt_mutex_take (ble_mutex, RT_WAITING_FOREVER); / 返回-8 /
这已经标明函数执行错误了,你们没有处理返回值,而继续执行其它操作。这个总不能指望 rtt 声光报警告诉你参数是 NULL? 而且你已经知道 ble_mutex 是个未初始化的对象。对于任意非初始化的对象,进行任何操作,没有谁给你保证给你出代码上的用法错误来。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
590 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2241 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1233 浏览 0 评论
1788 浏览 0 评论
1464 浏览 0 评论
74803 浏览 21 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 21:07 , Processed in 0.533029 second(s), Total 71, Slave 55 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号