HRTOS Time & Event Model

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)
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)

系统意义

在 HRTOS 中,delay 属于“时间驱动调度路径”, event 属于“事件驱动调度路径”。

实际系统中:event 模型通常用于高实时响应逻辑, delay 用于周期性背景任务。