优先级反转(Priority Inversion)

当高优先级任务被低优先级任务间接阻塞时,系统进入非预期调度状态, 导致实时性被中断破坏。

机制定义

High Task Waits Low Task Resource + Mid Task Preemption → Scheduling Inversion

触发条件

资源占用

低优先级任务持有互斥资源(Mutex/Semaphore)。

高优先级阻塞

高优先级任务等待资源释放。

中优先级抢占

中优先级任务持续运行,阻止低优先级释放资源。

系统影响

实时响应时间不可预测,系统抖动增加,可能违反硬实时约束。

解决方案

优先级继承

低优先级任务临时继承高优先级任务优先级。

os_mutex_lock

优先级天花板

资源绑定最高优先级限制,避免中断抢占。

核心API链路

演示代码


#include "hrtos.h"

sbit LED_HIGH = P1^0;
sbit LED_MID  = P1^1;
sbit LED_LOW  = P1^2;

static void high_task(void)
{
    while(1)
    {
        os_mutex_lock(0);
        LED_HIGH = ~LED_HIGH;
        os_mutex_unlock(0);
        os_delay(10);
    }
}

static void mid_task(void)
{
    while(1)
    {
        LED_MID = ~LED_MID;

        volatile u16 i;
        for(i = 0; i < 2000; i++);

        os_delay(20);
    }
}

static void low_task(void)
{
    while(1)
    {
        os_mutex_lock(0);
        LED_LOW = ~LED_LOW;
        os_delay(50);
        os_mutex_unlock(0);
    }
}

void hrtos_main(void)
{
    os_mutex_init(0);

    os_task_create((unsigned int)high_task, 1, 5, 5);
    os_task_create((unsigned int)mid_task,  2, 3, 5);
    os_task_create((unsigned int)low_task,  3, 1, 5);
}
    

总结

Priority Inversion 是 RTOS 调度系统必须通过 IPC 机制解决的核心问题。