优先级反转(Priority Inversion)
当高优先级任务被低优先级任务间接阻塞时,会发生优先级反转问题, 该现象是RTOS调度设计中的关键异常场景之一。
机制定义
高优先级任务等待低优先级任务释放资源,而中优先级任务持续抢占CPU → 导致高优先级任务被“反向延迟”
内核调度API入口
os_schedule_enter() → 进入调度上下文
os_context_save() → 保存任务上下文
os_scheduler_run() → 执行调度决策
os_context_restore() → 恢复目标任务
os_schedule_exit() → 退出调度流程
os_context_save() → 保存任务上下文
os_scheduler_run() → 执行调度决策
os_context_restore() → 恢复目标任务
os_schedule_exit() → 退出调度流程
触发条件
共享资源竞争
低优先级任务持有互斥资源。
高优先级任务阻塞
高优先级任务等待同一资源。
中优先级抢占
中优先级任务持续占用CPU,阻止低优先级运行。
系统影响
优先级反转会导致实时系统响应时间不可预测,严重时可能破坏实时性约束。
解决机制
优先级继承
低优先级任务临时继承高优先级任务优先级。
优先级天花板
资源绑定最高优先级限制,避免中断抢占。
演示代码
// HRTOS Priority Inversion Demo
// 说明:模拟资源竞争导致的优先级反转
#include
#include
#define TASK_HIGH 0
#define TASK_MID 1
#define TASK_LOW 2
void low_task(void)
{
os_mutex_lock(0);
while(1)
{
os_nop(); // 持有资源
}
}
void high_task(void)
{
while(1)
{
os_mutex_lock(0); // 等待低优先级释放
os_mutex_unlock(0);
}
}
void mid_task(void)
{
while(1)
{
os_nop(); // 抢占CPU
}
}
void system_init(void)
{
os_mutex_init(0);
os_task((unsigned int)low_task, TASK_LOW, 1, 0);
os_task((unsigned int)mid_task, TASK_MID, 2, 0);
os_task((unsigned int)high_task, TASK_HIGH, 3, 0);
}
系统意义
优先级反转是RTOS调度设计中必须解决的核心问题之一, 直接影响系统确定性与实时性边界。
核心API映射
中断触发 → os_interrupt_enter()
调度决策 → os_scheduler_run()
上下文切换 → os_context_switch()
任务恢复 → os_context_restore()
调度决策 → os_scheduler_run()
上下文切换 → os_context_switch()
任务恢复 → os_context_restore()