sunsili 发表于 2018-10-26 00:25:25

基于实时操作系统RTOS的优先级反转和避免反转的详细介绍

本帖最后由 sunsili 于 2022-2-26 23:15 编辑

基于实时操作系统RTOS的优先级反转和避免反转的详细介绍



实时操作系统(Real-time operating system, RTOS)是说,任务切换和中断响应的时间必须保证在多少时间内(如5us内)完成。
   分为硬实时和软实操作系统:
   硬实时是说必须在多少时间内完成切换(如VxWorks, 我们使用的ecos也是硬实时的)
   软实时则是绝大多数情况可以在多少时间内完成切换(如linux)

   从原理来看判断一个系统是否是实时只需要看它的调度算法即可,具体能实时在多少时间内,则要区分不同硬件了。

   为什么需要实时操作系统呢?
   举一个经常使用的实例,中高档汽车中使用的气囊。当报告车辆碰撞的传感器中断CPU后,操作系统应快速地分配展开气囊的任务,并且不允许任何其他非实时处理进行干扰,晚一秒钟展开气囊比没有气囊的情况更糟糕,这就是一个典型的必须使用硬实时的系统。
   除为中断处理提供确定性外,实时处理也需要支持周期性间隔的任务调度。大量控制系统要求周期性采样与处理。某个特定任务必须按照固定的周期(p)执行,从而确保系统的稳定性。考虑一下汽车的防抱死系统(ABS)。控制系统对车辆的每个车轮的转速进行采样(每秒最多 20 次)并控制每个制动器的压力(防止它锁死)。为了保持控制系统的正常工作,传感器的采样与控制必须按照一定的周期间隔。这意味着必须抢占其他处理,以便 ABS 任务能按照期望的周期执行。

   大多数实时操作系统使用的都是基于优先级的可抢占式调用策略,同一优先级则使用时间片轮转调度。

   什么是优先级反转
   优先级反转的含义是说高优先级的任务被迫等待低优先级任务执行。
   因为多进程共享资源, 当出现互斥资源访问时,基于优先级调度会有如下这种现象:
   三个任务task1, task2, task3,优先级 task1 > task2 > task3,当task1和task2某种原因被阻塞时,task3调度执行,task3执行时占用互斥资源A执行临界区代码时,很巧task1这时从阻塞状态恢复,基于优先级的调度会立即调度到task1执行,而task1执行时又需要持有互斥资源A,因此task1再度进入阻塞状态,等待task3执行。task3执行还未释放互斥资源A,这时task2从阻塞状态恢复立马得到调度执行并一直等到task2执行完毕。这时就相当于高优先级的task1需要等待中优先级的task2执行了,这就是优先级反转。

   如何避免优先级反转?
   解决优先级反转有许多方法,普遍使用的有两种:优先级继承;极限优先级。
   优先级继承:当高优先级的任务需要等待低优先级任务释放互斥资源时,暂时先把低优先级任务的优先级提升至和高优先级任务优先级一样。这样就确保了不会有其他中优先级任务抢占执行。(ecos产品使用这种)
   极限优先级:当任务占用互斥资源执行临界区代码时,先把该任务的优先级提升至极限优先级(系统最高优先级),等到释放资源时再降回原有优先级。

基于操作系统的优先级反转和避免反转的详细介绍
http://bbs.cirmall.com/thread-52338-1-1.html
(出处: 电路城)


页: [1]
查看完整版本: 基于实时操作系统RTOS的优先级反转和避免反转的详细介绍