3、优先级翻转问题
FreeRTOS优先级翻转是当高优先级任务因等待低优先级任务占用的资源(如互斥锁)被阻塞,而中优先级任务趁机执行,导致高优先级任务无法及时运行的调度异常。
-
场景示例:
-
任务优先级:存在三个任务,优先级从高到低为 Task_H(高)、Task_M(中)、Task_L(低)。
-
共享资源:Task_L 和 Task_H 都需要访问某个共享资源(如互斥锁
Mutex
)。 -
执行流程:
-
Task_L 获取
Mutex
,开始操作共享资源。 -
Task_H 就绪,尝试获取
Mutex
,但发现已被占用,因此被阻塞。 -
此时,Task_M(中等优先级)开始运行,抢占 Task_L。
-
Task_L 因被 Task_M 抢占,无法及时释放
Mutex
,导致 Task_H 被长期阻塞。
-
结果:高优先级任务 Task_H 被低优先级任务 Task_L 间接阻塞,而 Task_M(与共享资源无关)反而优先执行,破坏了实时性。
-
FreeRTOS 的解决方案
1. 优先级继承(Priority Inheritance)
-
机制:当高优先级任务因等待
Mutex
被阻塞时,持有该Mutex
的低优先级任务会临时继承高优先级任务的优先级。 -
效果:低优先级任务 Task_L 的优先级被提升到与 Task_H 相同,从而能快速执行并释放
Mutex
,避免被 Task_M 抢占。 -
触发条件:使用
xSemaphoreCreateMutex()
创建的互斥锁默认启用优先级继承。
优先级继承无法完全解决优先级翻转,只是在某些情况下将影响降至最低。