完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先,为什么在申请和释放内存的过程中要用 IPC 来做互斥,而不是关中断,这是为了性能考虑。
这里使用信号量可能是因为信号量是系统中实现的第一个 IPC。 互斥量的实现目前在一些复杂情况下仍然有一些异常行为,会导致线程运行的时序可能并不如预想的那样,理论上来说,如果互斥量的实现很完美,那么这里使用互斥量来代替信号量应该是更好的选择。 |
|
|
|
互斥量的实现目前在一些复杂情况下仍然有一些异常行为,可以举个例子吗,我仿真一下。
我个人认为,信号量主要是用于线程间同步,保护全局变量用互斥信号量。当然,就算用信号量保护全局变量造成优先级翻转,一般很难通过设备运行状态发现 |
|
|
|
A(优先级20)已经获得互斥锁
此时 B(优先级 1) 尝试获取互斥锁 此时 C (优先级 10) 尝试获取互斥锁 此时 A 线程优先级被短暂提升为 1,继续运行,释放互斥锁后,优先级被降低为原优先级 20,但是由于线程 C 已经在尝试获取该锁,那么理论上其优先级应当降低为 10,而不是优先级 20。 还有第二种情况: A(优先级20)已经获得互斥锁 此时 B(优先级 1) 尝试获取互斥锁 如果 B 因为超时退出,而 A 的优先级任然被短暂提高,造成 A 线程意外得到了运行。 这些地方是不完善的,有些情况是历史遗留问题,需要逐渐改进。 |
|
|
|
你说的第一种情况:A线程(优先级20),B线程(优先级1),C线程(优先级10),A线程先获取互斥信号量,B和C尝试获取该信号量失败,A线程当前优先级为1(继承B线程优先级)。当A释放掉互斥信号量后,此时互斥信号量被B线程占有,当B释放互斥信号量,互斥信号量被C线程占有.目前FreeRTOS和Rt-thread都是这样的实现的
|
|
|
|
你说的第一种情况,线程A释放掉互斥信号量之后就应该恢复到初始优先级
你说的第二种情况:FreeRtos里面的互斥信号量在B线程超时后会进行A线程优先级恢复操作,如果存在C线程之前尝试访问互斥信号量,则当B线程超时后,此时A线程将继承C线程的优先级,否则恢复A线程默认优先级。Rt-thread目前没有做超时处理,当B线程超时后会以B线程的优先级运行直到信号量释放。建议:RT-thread使用互斥信号量超时时间设置RT_WAITING_FOREVER,可以解决你说的第二个问题 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
541 浏览 0 评论
1920 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2188 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统威廉希尔官方网站 与产业发展论坛”圆满结束
2681 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
29139 浏览 11 评论
72215 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 16:27 , Processed in 0.405429 second(s), Total 46, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号