优先级翻转与优先级继承
优先级翻转在可剥夺内核中是非常常见的,例子如下(h:high、m:middle、l:low)
任务 h 和任务 m 处于挂起状态,等待某一事件的发生,任务 l 正在运行。
某一时刻任务 l 想要访问共享资源,在此之前它必须先获得对应该资源的信号量。
任务 l 获得信号量并开始使用该共享资源。
由于任务 h 优先级高,它等待的事件发生后便剥夺了任务 l 的 cpu 使用权。
任务 h 开始运行。
任务 h 运行过程中也要使用任务 l 正在使用着的资源,由于该资源的信号量还被任务l 占用着,任务 h 只能进入挂起状态,等待任务 l
释放该信号量。
任务 l 继续运行。
由于任务 m 的优先级高于任务 l,当任务 m 等待的事件发生后,任务 m 剥夺了任务l 的 cpu 使用权。
任务 m 处理该处理的事。
任务 m 执行完毕后,将 cpu 使用权归还给任务 l。
任务 l 继续运行。
最终任务 l 完成所有的工作并释放了信号量,到此为止,由于实时内核知道有个高优先级的任务在等待这个信号量,故内核做任务切换。
任务 h 得到该信号量并接着运行。
在这种情况下,任务 h 的优先级实际上降到了任务 l 的优先级水平。因为任务 h 要一直等待直到任务 l 释放其占用的那个共享资源。由于任务 m剥夺了任务 l 的 cpu 使用权,使得任务 h 的情况更加恶化,这样就相当于任务 m 的优先级高于任务 h,导致优先级翻转。
linux 用 rt_mutex 来解决该问题,rt_mutex 是带优先级继承的互斥锁。
当一个 rt_mutex 正在被一个低优先级的任务使用,而此时有个高优先级的任务也尝试获取这个 rt_mutex的话就会被阻塞。不过这个高优先级的任务会将低优先级任务的优先级提升到与自己相同的优先级,这就是优先级继承。优先级继承尽可能的降低了高优先级任务处于阻塞态的时间,并且将已经出现的“优先级翻转”的影响降到最低。
优先级继承并不能完全的消除优先级翻转,它只是尽可能的降低优先级翻转带来的影响。
rt_mutex 不能用于中断服务函数中,原因如下:
rt_mutex 有优先级继承的机制,所以只能用在任务中,不能用于中断服务函数。
中断服务函数中不能因为要等待 rt_mutex 而设置阻塞时间进入阻塞态。
在 i2c_transfer 调用 __i2c_transfer 之前,就加了 rt_mutex,保证 i2c 传输尽快执行。
基于一款通用版的智能家居设计方案解析
电池性能和成本成为支配电动重卡能否正常运营的关键点
专业厂家教你大电流锂电池保护板的保护方法和流程是怎么样的
Intel表示28核心56线程工作站级新品将依然使用硅脂
古尔曼:苹果明年将更新整个iPad产品线
I2C子系统优先级翻转与优先级继承
Wacom推VR Pen,展现跨现实的手写笔体验
平安好医生联手中新药业,在AI+家庭医生等方面展开深入研究
云知声发布全球首款面向物联网领域的AI芯片“雨燕”
IE浏览器宣布正式退役
闻泰收购安世半导体100%股权具体方案出炉
CBB电容器的寿命如何延长
基于S3C2440A嵌入式处理器和Linux实现车载导航系统的应用方案
EMC保护电路简介及电路应用
基于DM642的视音频采集器的设计
丝印机怎么维修
中国移动通信联合会数字经济产业委员会正式启动
磁栅尺光栅尺编码器5MHz高速差分信号脉冲计数数据采集模块/4倍频
2020年至2021年普通光缆产品集采中标结果揭晓
联想ThinkSystem DM5100F全闪存阵列:全闪存阵列优势的集大成者