等待机制(Wait Mechanism)

HRTOS等待机制是内核任务阻塞管理核心,通过统一等待模型, 将延时、同步、通信等不同阻塞场景抽象为统一任务等待流程。

一、统一等待模型设计

传统RTOS通常针对不同内核对象分别实现阻塞逻辑, 例如信号量、消息队列、事件等待分别维护任务状态。 HRTOS采用统一WAIT模型,将不同等待源统一映射到任务控制块。

WAIT_NONE 无等待 WAIT_DELAY 时间等待 WAIT_SEM 信号量等待 WAIT_MUTEX 互斥锁等待 WAIT_MSG_SEND 消息发送等待 WAIT_MSG_RECV 消息接收等待 WAIT_EVENT 事件等待 WAIT_MAILBOX 邮箱等待

任务在任意时刻只允许存在一种等待状态, 等待信息统一保存在TCB中。

二、任务等待上下文管理

typedef struct { u8 wait_type; u8 wait_flag; u8 wait_obj; u16 wait_tick; } OS_TCB;

HRTOS将等待上下文直接存储于任务控制块中。 当任务进入阻塞状态时,内核保存等待类型、 等待对象以及超时时间。

任务恢复运行后,通过wait_flag判断唤醒原因:

WAIT_TIMEOUT 超时唤醒 WAIT_SIGNAL 条件满足唤醒

三、资源等待队列模型

typedef struct { u8 value; u8 owner; u8 wait_cnt; u16 wait_mask; } OS_RESOURCE;

HRTOS所有资源对象采用统一等待队列模型。 信号量、互斥锁、事件以及消息等待均通过资源等待位图管理。

wait_mask bit0 -> task0 bit1 -> task1 ... bit15 -> task15

通过位图方式管理等待任务, 适用于8051有限资源环境,可降低内存占用。

四、任务进入等待流程

任务运行 ↓ 调用 os_wait() ↓ 保存等待信息 (wait_type / wait_obj / wait_tick) ↓ 加入资源等待队列 ↓ 任务状态变为 WAIT ↓ 触发调度 ↓ 运行其他任务

os_wait()是HRTOS统一阻塞入口, 所有需要暂停执行的内核操作最终通过该接口进入等待状态。

五、任务唤醒流程

事件发生 ↓ 调用 wake_task() ↓ 移除等待位图 ↓ 设置 wait_flag ↓ 清除等待信息 ↓ 任务进入 READY ↓ 重新参与调度

wake_task()统一处理任务恢复过程, 保证不同等待来源拥有一致的唤醒路径。

六、设计特点

  • 统一等待入口,减少内核重复代码
  • TCB保存等待上下文,结构清晰
  • 资源对象共享等待队列模型
  • 支持时间等待与事件等待统一管理
  • 适合8051低资源环境