os_delay vs os_event_wait(时间阻塞 vs 事件阻塞)
本示例基于 HRTOS 实际 API 行为,对比时间驱动阻塞(os_delay) 与事件驱动阻塞(os_event_wait)的调度差异,并通过 LED 行为直观验证。
机制定义
os_delay → 时间驱动阻塞(Tick countdown based blocking)
os_event_wait → 事件驱动阻塞(Event wake-up based blocking)
os_event_wait → 事件驱动阻塞(Event wake-up based blocking)
HRTOS Model = Tick Scheduler + Time Blocking + Event Blocking + ISR/Task Wake-up Dispatch
核心行为差异
os_delay(时间任务)
任务进入延时队列,由系统 Tick 递减计数,到期后恢复调度。
os_event_wait(事件任务)
任务阻塞在事件队列,直到 os_event_write 触发立即唤醒。
调度触发机制
delay → Tick驱动调度;event → ISR/任务主动唤醒调度。
实时性
事件模型优先级更高,响应延迟显著低于纯时间模型。
执行流程
Delay Task
运行 → LED翻转 → os_delay → Tick阻塞 → 恢复
Event Task
等待 → os_event_wait → 阻塞 → os_event_write触发 → 立即唤醒
Trigger Task
周期延时 → 写事件 → 唤醒等待任务
示例代码
#include "hrtos.h"
#define EVENT_ID 1
sbit LED_DELAY = P1^0;
sbit LED_WAIT = P1^1;
sbit LED_EVENT = P1^2;
/* 时间驱动任务 */
void task_delay(void)
{
while(1)
{
LED_DELAY = ~LED_DELAY;
os_delay(10); // Tick阻塞
}
}
/* 事件等待任务 */
void task_wait(void)
{
while(1)
{
if(os_event_wait(EVENT_ID, 0))
{
LED_WAIT = ~LED_WAIT;
os_event_delete(EVENT_ID);
{
u16 i = 10000;
while(i--);
}
}
}
}
/* 事件触发任务 */
void task_event_trigger(void)
{
while(1)
{
os_delay(20);
os_event_write(EVENT_ID);
LED_EVENT = ~LED_EVENT;
}
}
/* 系统入口 */
void hrtos_main(void)
{
LED_DELAY = 0;
LED_WAIT = 0;
LED_EVENT = 0;
os_event_init(EVENT_ID);
os_task_create((unsigned int)task_delay, 1, 2, 5);
os_task_create((unsigned int)task_wait, 2, 3, 5);
os_task_create((unsigned int)task_event_trigger,3, 2, 5);
}
API 对照(v2)
Time API
Event IPC API
Task API
系统意义
在 HRTOS 中,delay 属于“时间驱动调度路径”,
event 属于“事件驱动调度路径”。
实际系统中:event 模型通常用于高实时响应逻辑, delay 用于周期性背景任务。
实际系统中:event 模型通常用于高实时响应逻辑, delay 用于周期性背景任务。