等待机制(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低资源环境