优先级继承
在 HRTOS v2 中,当高优先级任务竞争 mutex 时,系统会临时提升低优先级持锁任务的调度优先级, 防止其被其他任务抢占,从而避免优先级反转。
真实系统行为
低优先级 task_low 持锁 → 占用资源 → 延迟释放
高优先级 task_high 尝试获取锁 → 阻塞等待
系统检测到竞争 → 提升 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 在资源竞争情况下仍然保持确定性调度行为。
核心结果:
• 防止高优先级任务被长期阻塞
• 减少不可预测调度延迟
• 保持实时系统稳定性
• 防止高优先级任务被长期阻塞
• 减少不可预测调度延迟
• 保持实时系统稳定性