os_wait

所属模块:内核调度 | 类型:统一阻塞接口

API Metadata

函数ID:os_wait
模块:kernel scheduler
类型:unified wait / block API
嵌套深度:1

函数简介

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(信号量、互斥锁、消息队列、事件)最终都会映射到该接口。

相关推荐