os_event_wait
所属模块:通信机制 | 类型:事件阻塞等待函数
函数简介
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)
{
// 事件触发处理
}
}
注意事项
该函数具有“快速路径优化”,事件已触发时不会进入调度器。
未触发时将进入阻塞状态,由内核统一调度唤醒。