os_event_wait

所属模块:通信机制 | 类型:事件阻塞等待函数

API Metadata

函数ID:os_event_wait
模块:event
类型:event wait
嵌套深度:2

函数简介

os_event_wait 用于等待指定事件被触发, 支持超时机制,是任务进入阻塞状态的核心同步接口。

如果事件已触发,则立即返回;否则任务进入等待状态, 由调度器在事件到达或超时后唤醒。

函数原型

char os_event_wait(u8 obj, u16 tick);

参数说明

参数 说明
obj 事件ID(0 ~ OS_RESOURCE_MAX-1)
tick 超时时间(系统节拍)

返回值

1 - 事件已触发(立即返回)
0 / -1 - 等待失败或超时(取决于os_wait返回值)

源码实现

/*------------------------------------------------------------------------ | FILE DESCRIPTION | ------------------------------------------------------------------------*/ /*------------------------------------------------------------------------ | - File name : event_wait.c | - Author : 谭舒 | - Update date : 2026-09-19 | - Copyright(C) : 2026 HRTOS. All rights reserved. ------------------------------------------------------------------------*/ /*------------------------------------------------------------------------ | INCLUDES | ------------------------------------------------------------------------*/ #include"hrtos_internal.h" /*------------------------------------------------------------------------ | API FUNCTIONS | ------------------------------------------------------------------------*/ /** * @brief 等待指定事件触发。 * * @param[in] obj 事件资源槽位编号。 * @param[in] tick 最大等待时间,以系统节拍数为单位。 * * @return 操作结果。 * @retval 1 事件已触发,无需进入等待。 * @retval -1 事件资源槽位编号无效。 * @retval 其他 等待操作返回的结果。 * * @note 当指定事件已经触发时,函数直接返回,不进入等待状态。 * 当事件未触发时,任务进入事件等待状态,并根据 tick 参数确定等待时间。 */ char os_event_wait(u8 obj, u16 tick) { if(obj >= OS_RESOURCE_MAX) { return -1; } EA=0; /* 事件已触发,直接返回 */ if(OS_RES[obj].value) { EA=1; return 1; } EA=1; /* 否则进入等待 */ return os_wait(WAIT_EVENT, obj, tick); } /*------------------------------------------------------------------------ | END OF FILE: event_wait.c | ------------------------------------------------------------------------*/

使用示例

void task() { if(os_event_wait(2, 100) == 1) { // 事件触发处理 } }

注意事项

该函数具有“快速路径优化”,事件已触发时不会进入调度器。 未触发时将进入阻塞状态,由内核统一调度唤醒。

相关推荐