HRTOS Wait

等待机制使用(Wait Usage)

HRTOS应用层通过任务同步与通信接口使用WAIT机制, 无需直接操作内核等待结构。

概述

HRTOS中的WAIT机制位于内核层, 应用程序通常通过delay、semaphore、mutex、message以及event接口间接使用。

所有阻塞操作最终统一进入os_wait(), 由内核完成任务状态切换和调度处理。

应用层关注等待条件,内核负责等待状态管理。

时间等待(Delay)

任务需要主动等待一定时间时,可以使用延时接口。

os_delay(tick); 执行流程: os_delay() ↓ WAIT_DELAY ↓ 等待tick递减 ↓ READY

延时等待不会关联资源对象,只依赖系统Tick。

信号量等待(Semaphore)

os_sem_wait(sid); 内部流程: Semaphore ↓ 资源不可用 ↓ WAIT_SEM ↓ os_wait() ↓ 任务阻塞

当其他任务调用post释放信号量后, 等待任务被唤醒。

互斥锁等待(Mutex)

os_mutex_lock(mid); 流程: 获取Mutex ↓ 成功 继续执行 失败 ↓ WAIT_MUTEX ↓ 等待锁释放

HRTOS支持Mutex优先级继承, 避免高优先级任务长期等待。

消息等待(Message Queue)

os_msgq_send() os_msgq_recv() 发送等待: WAIT_MSG_SEND 接收等待: WAIT_MSG_RECV

消息队列满或空时, 任务通过WAIT机制进入阻塞状态。

事件与邮箱等待

事件: os_event_wait(id,tick) 邮箱: os_mailbox_receive(mid) 对应等待类型: WAIT_EVENT WAIT_MAILBOX

事件和邮箱同样使用统一资源等待模型。

典型使用流程

任务运行 ↓ 调用同步API ↓ 条件满足? ↓ ↓ 是 否 继续执行 os_wait() ↓ WAIT ↓ wake_task() ↓ READY

核心接口

/* WAIT核心 */ u8 os_wait( u8 type, u8 obj, u16 tick ); /* 唤醒 */ void wake_task( u8 tid, u8 flag );

通常情况下,应用程序无需直接调用上述接口。

os_wait主要用于内核模块实现,应用层推荐使用高级同步API。

简单示例

void task_example(void) { while(1) { //等待事件 os_event_wait(0,100); //处理任务 } }

任务等待结束后自动恢复执行, 无需应用程序轮询检查状态。

使用特点

  • 统一阻塞接口
  • 支持超时控制
  • 支持任务与ISR唤醒
  • 减少应用层轮询代码
  • 适合实时任务设计