os_wait
所属模块:内核调度 | 类型:统一阻塞接口
函数简介
os_wait 是 HRTOS 的统一阻塞接口,
用于将当前任务置为等待状态,并根据不同等待类型进入调度体系。
支持多种等待模式:
延时等待、信号量等待、互斥锁等待、消息队列等待以及事件等待。
函数原型
u8 os_wait(u8 type, u8 obj, u16 tick);
参数说明
| 参数 |
说明 |
| type |
等待类型(WAIT_DELAY / WAIT_SEM / WAIT_MUTEX / WAIT_MSG / WAIT_EVENT) |
| obj |
等待资源ID(仅资源类等待有效) |
| tick |
超时 tick(仅 WAIT_DELAY 或带超时等待使用) |
返回值
WAIT_SIGNAL - 被资源/事件唤醒
WAIT_TIMEOUT - 超时返回
0 - 非法参数或异常路径返回
源码实现
#include "hrtos_internal.h"
/* =========================================================
* 统一阻塞调度核心
*/
u8 os_wait(u8 type, u8 obj, u16 tick)
{
u8 tid;
EA = 0;
tid = OS_CURRENT_TASK;
/* -------------------------
* 延时等待路径
* ------------------------- */
if(type == WAIT_DELAY)
{
if(tick == 0)
{
EA = 1;
return WAIT_TIMEOUT;
}
OS_TASK[tid].wait_type = type;
OS_TASK[tid].wait_obj = obj;
OS_TASK[tid].wait_tick = tick;
OS_TASK[tid].wait_flag = 0;
OS_TASK[tid].state = WAIT;
OS_PROCESS_OK[tid] &= 0xFE;
OS_SCHED_REASON = 1;
EA = 1;
TF0 = 1;
return OS_TASK[tid].wait_flag;
}
/* -------------------------
* 重复等待保护
* ------------------------- */
if(OS_TASK[tid].wait_type != WAIT_NONE)
{
EA = 1;
return 0;
}
if(type != WAIT_DELAY && obj >= OS_RESOURCE_MAX)
{
EA = 1;
return 0;
}
/* -------------------------
* 设置等待信息
* ------------------------- */
OS_TASK[tid].wait_type = type;
OS_TASK[tid].wait_obj = obj;
OS_TASK[tid].wait_tick = tick;
OS_TASK[tid].wait_flag = 0;
if(type != WAIT_DELAY && obj != OS_INVALID_ID)
{
OS_RES[obj].wait_mask |= ((u16)1 << tid);
OS_RES[obj].wait_cnt++;
}
OS_TASK[tid].state = WAIT;
OS_PROCESS_OK[tid] &= 0xFE;
OS_SCHED_REASON = 1;
EA = 1;
TF0 = 1;
return OS_TASK[tid].wait_flag;
}
使用示例
void task()
{
os_wait(WAIT_DELAY, 0, 100);
}
注意事项
该函数是 HRTOS 所有阻塞机制的统一入口,
不同 IPC(信号量、互斥锁、消息队列、事件)最终都会映射到该接口。