Mutex机制
HRTOS v2 使用 mutex 锁保护共享资源, 当高优先级任务尝试获取已被低优先级任务持有的锁时, 系统自动触发优先级继承。
在 HRTOS v2 中,当高优先级任务竞争 mutex 时,系统会临时提升低优先级持锁任务的调度优先级, 防止其被其他任务抢占,从而避免优先级反转。
系统创建 task_low(低优先级)和 task_high(高优先级)双任务系统, 通过 mutex 锁竞争演示优先级继承机制。验证 HRTOS v2 在资源竞争情况下保持确定性调度行为。
优先级反转问题
优先级继承机制用于解决实时系统中的优先级反转问题。 当高优先级任务等待低优先级任务持有的资源时, 如果没有优先级继承,中优先级任务可能抢占低优先级任务, 导致高优先级任务被长期阻塞。
Mutex 优先级继承
核心 API: os_mutex_lock · os_mutex_unlock · os_delay
HRTOS v2 使用 mutex 锁保护共享资源, 当高优先级任务尝试获取已被低优先级任务持有的锁时, 系统自动触发优先级继承。
调度器临时提升低优先级持锁任务的运行优先级至高优先级任务的水平, 使其能够优先完成临界区执行,快速释放资源。
优先级继承发生在 mutex lock 阻塞链路中, 调度器会临时改变 task_low 的运行优先级,使其优先完成临界区执行。
优先级继承的执行流程
关联API: os_mutex_lock · os_mutex_unlock · os_task_yield
优先级继承的完整实现
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);
}
优先级继承的核心价值
优先级继承保证 HRTOS 在资源竞争情况下仍然保持确定性调度行为。
深入学习的相关资源