H HRTOS 示例
Task Execution Core

优先级继承

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

示例目标

系统创建 task_low(低优先级)和 task_high(高优先级)双任务系统, 通过 mutex 锁竞争演示优先级继承机制。验证 HRTOS v2 在资源竞争情况下保持确定性调度行为。

核心API os_mutex_lock
释放机制 os_mutex_unlock
优先级提升 临时继承机制
调度保障 避免优先级反转

核心机制

  • Mutex 锁竞争检测
  • 低优先级任务临时提升
  • 资源释放后恢复原优先级
  • 确定性调度行为保障
Problem Background

问题背景

优先级反转问题

优先级继承机制用于解决实时系统中的优先级反转问题。 当高优先级任务等待低优先级任务持有的资源时, 如果没有优先级继承,中优先级任务可能抢占低优先级任务, 导致高优先级任务被长期阻塞。

传统互斥机制的问题: 高优先级任务被中优先级任务间接阻塞,违反实时性要求。
Implementation Mechanism

HRTOS实现机制

Mutex 优先级继承

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

核心 API: os_mutex_lock · os_mutex_unlock · os_delay

Mutex机制

HRTOS v2 使用 mutex 锁保护共享资源, 当高优先级任务尝试获取已被低优先级任务持有的锁时, 系统自动触发优先级继承。

优先级提升过程

调度器临时提升低优先级持锁任务的运行优先级至高优先级任务的水平, 使其能够优先完成临界区执行,快速释放资源。

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

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

Workflow

工作流程

优先级继承的执行流程

1task_low 持锁:进入临界区,占用 RES_LOCK_ID
2task_high 请求锁:调用 os_mutex_lock 被阻塞
3触发优先级继承:task_low 优先级临时提升
4task_low 加速执行:完成 os_delay 后释放 mutex
5task_high 恢复运行:成功获取锁并继续执行
task_low 持锁 → task_high 阻塞 → 优先级继承 → task_low 加速释放 → task_high 恢复运行

关联API: os_mutex_lock · os_mutex_unlock · os_task_yield

Demo Code

示例代码

优先级继承的完整实现

优先级继承演示

task_low 和 task_high 任务函数,展示 mutex 锁竞争和优先级继承机制

#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);
}
System Significance

系统意义

优先级继承的核心价值

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

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