IPC Core

优先级继承

在 HRTOS v2 中,当高优先级任务竞争 mutex 时,系统会临时提升低优先级持锁任务的调度优先级, 防止其被其他任务抢占,从而避免优先级反转。

真实系统行为

低优先级 task_low 持锁 → 占用资源 → 延迟释放
高优先级 task_high 尝试获取锁 → 阻塞等待
系统检测到竞争 → 提升 task_low 优先级 → 加速释放

核心 API: os_mutex_lock · os_mutex_unlock · os_delay

关键机制不是“公式”,而是调度变化

优先级继承发生在 mutex lock 阻塞链路中, 调度器会临时改变 task_low 的运行优先级,使其优先完成临界区执行。

执行流程

1. task_low 持锁

进入临界区,占用 RES_LOCK_ID

2. task_high 请求锁

调用 os_mutex_lock 被阻塞

3. 触发优先级继承

task_low 优先级临时提升

4. task_low 加速执行

完成 os_delay 后释放 mutex

5. task_high 恢复运行

成功获取锁并继续执行

关联API: os_mutex_lock · os_mutex_unlock · os_task_yield

演示代码


#include "hrtos.h"

#define RES_LOCK_ID  1

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

/* 低优先级任务:持锁 + 长时间执行 */
void task_low(void)
{
    os_mutex_lock(RES_LOCK_ID);

    LED_LOW = 1;   // 进入临界区标记

    /* 模拟临界区占用资源 */
    os_delay(30);

    LED_LOW = 0;

    os_mutex_unlock(RES_LOCK_ID);

    while(1)
    {
        os_task_yield();
    }
}

/* 高优先级任务:尝试频繁获取锁 */
void task_high(void)
{
    while(1)
    {
        if(os_mutex_lock(RES_LOCK_ID) == 0)
        {
            LED_HIGH = 1;   // 成功获取锁(说明低任务已释放)
            os_delay(5);
            LED_HIGH = 0;

            os_mutex_unlock(RES_LOCK_ID);
        }
        else
        {
            LED_HIGH = ~LED_HIGH;
            os_delay(2);
        }

        os_task_yield();
    }
}

/* 系统入口 */
void hrtos_main(void)
{
    LED_LOW = 0;
    LED_HIGH = 0;

    os_mutex_init(RES_LOCK_ID);

    os_task_create((unsigned int)task_low,  1, 1, 5);
    os_task_create((unsigned int)task_high, 2, 3, 5);
}
    

系统意义

优先级继承保证 HRTOS 在资源竞争情况下仍然保持确定性调度行为。

核心结果:
• 防止高优先级任务被长期阻塞
• 减少不可预测调度延迟
• 保持实时系统稳定性