概述
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唤醒
- 减少应用层轮询代码
- 适合实时任务设计