H HRTOS 示例
System Resource Core

资源分配

在 HRTOS v2 中,资源分配通过 mutex、调度器和优先级继承机制实现任务级资源仲裁, 而不是简单的内存池模拟。资源分配是确保系统稳定性和可靠性的关键机制。

示例目标

系统运行两个任务:高优先级任务 task_A 和低优先级任务 task_B,通过 mutex 保护共享资源。 验证在资源竞争情况下,通过优先级继承机制避免优先级反转,确保系统实时性。

核心API os_mutex_lock
仲裁机制 优先级继承
调度触发 资源竞争
状态转换 Running → Blocked

核心机制

  • Mutex 保护临界区
  • 优先级仲裁
  • 调度器介入
  • 资源释放与调度
Principle

原理说明

资源分配是 RTOS 系统稳定性的关键基础

在嵌入式实时系统中,资源分配的核心不在于"分配算法",而在于"调度器介入 + 阻塞机制 + 优先级继承"。 所有资源竞争必须进入内核仲裁路径,而不是用户态轮询。这是 RTOS 稳定性的关键基础。

机制定义: Resource Allocation = Mutex Lock + Priority Arbitration + Scheduler Control + Release

Mutex 保护临界区

Mutex(互斥锁)用于保护共享资源,确保同一时间只有一个任务能够访问临界区。 防止并发访问导致的数据竞争和资源破坏。

优先级仲裁

当高优先级任务被低优先级任务阻塞时,通过优先级继承机制临时提升低优先级任务的优先级, 避免优先级反转问题,确保系统实时性。

调度器介入

资源竞争直接触发任务状态变化,从 Running 状态进入 Blocked 状态。 调度器根据优先级和资源状态重新选择就绪任务执行。

资源释放与调度

当任务释放资源后,调度器检查阻塞队列,唤醒等待该资源的高优先级任务, 实现资源的合理分配和任务的公平调度。

HRTOS Implementation

HRTOS 实现机制

HRTOS 如何实现资源分配

在 HRTOS v2 中,资源分配的实现围绕 Mutex 保护、优先级继承、调度器介入和资源释放四个核心环节展开。 每个环节都经过精心设计,确保资源管理的高效性和可靠性。

Mutex 保护临界区

保护内容:共享资源、临界区代码、数据结构

保护方式:互斥锁(Mutex)机制

锁定时机:任务访问共享资源前

设计考虑:最小化临界区范围,减少锁竞争

优先级继承

继承条件:高优先级任务被低优先级任务阻塞

继承方式:临时提升持有锁任务的优先级

恢复时机:任务释放锁后恢复原优先级

解决目标:避免优先级反转,保证实时性

调度器介入

介入条件:资源竞争、锁不可用

状态转换:Running → Blocked

阻塞队列:维护等待资源的任务

调度策略:基于优先级的资源分配

资源释放与调度

释放操作:任务释放 Mutex 锁

唤醒机制:检查阻塞队列,唤醒等待任务

调度触发:重新评估就绪任务优先级

状态转换:Blocked → Ready

Workflow

工作流程

资源申请到释放的完整执行路径

1任务申请资源:任务调用 os_mutex_lock 申请 Mutex 锁
2内核检查状态:内核检查资源是否可用
3发生冲突处理:资源被占用,任务进入阻塞队列
4优先级继承:高优先级任务被阻塞时,提升持锁任务优先级
5资源释放调度:持锁任务释放资源,调度器唤醒等待任务
os_mutex_lock → 内核检查 → 资源可用 → 进入临界区 → 资源不可用 → 阻塞队列 → 优先级继承 → os_mutex_unlock → 唤醒等待任务 → 重新调度
Core Code

核心代码

资源分配的完整实现

任务函数实现

task_A 和 task_B 任务函数,通过 mutex 保护共享资源

#include "hrtos.h"

#define TASK_A 1
#define TASK_B 2
#define MUTEX_ID 0

sbit LED_OK   = P1^0;
sbit LED_FAIL = P1^1;

/* 高优先级任务 */
void task_A(void)
{
    while(1)
    {
        os_mutex_lock(MUTEX_ID);

        /* critical section */
        LED_OK = ~LED_OK;

        os_mutex_unlock(MUTEX_ID);

        os_delay(10);
    }
}

/* 低优先级任务(可能阻塞高优先级资源) */
void task_B(void)
{
    while(1)
    {
        os_mutex_lock(MUTEX_ID);

        os_delay(50);   // 模拟持锁延迟

        LED_FAIL = ~LED_FAIL;

        os_mutex_unlock(MUTEX_ID);
    }
}

系统初始化与任务创建

hrtos_main 函数,初始化 mutex 并创建两个任务

void hrtos_main(void)
{
    LED_OK = 0;
    LED_FAIL = 0;

    os_mutex_init(MUTEX_ID);

    os_task_create((unsigned int)task_B, TASK_B, 2, 5);
    os_task_create((unsigned int)task_A, TASK_A, 3, 5);
}
Expected Result

运行结果

示例执行后的预期行为

LED 状态 LED_OK 和 LED_FAIL 正常翻转,表示资源分配正常工作
资源竞争 高优先级任务 task_A 不会被低优先级任务 task_B 长期阻塞
优先级继承 当 task_A 等待资源时,task_B 优先级临时提升,快速释放资源
系统本质: 本示例的核心不是 LED,而是验证 HRTOS v2 中:通过 mutex 和优先级继承机制实现任务级资源仲裁,确保系统稳定性和实时性。
Important Notes

注意事项

使用本示例时需要关注的关键点

Mutex 初始化

在使用 mutex 之前必须调用 os_mutex_init 进行初始化。 未初始化的 mutex 可能导致不可预期的行为,包括死锁和系统崩溃。

临界区范围

临界区代码应尽可能简短,避免在持有锁的情况下执行耗时操作。 长时间持锁会增加其他任务的等待时间,影响系统响应性。

优先级设置

本示例中 task_A 优先级高于 task_B,用于演示优先级继承机制。 实际应用中应根据任务重要性和实时性要求合理设置优先级。

死锁预防

避免嵌套锁和循环等待,这是死锁的常见原因。 如果必须使用多个锁,应按照固定的顺序获取锁,并确保在所有路径上都能正确释放。