os_sem_wait

所属模块:同步机制 | 类型:信号量获取函数

API Metadata

函数ID:os_sem_wait
模块:semaphore
类型:semaphore wait (P operation)
嵌套深度:2

函数简介

os_sem_wait 用于获取信号量资源(P操作), 当资源可用时直接获取,否则进入阻塞等待状态。

该函数采用“快路径 + 慢路径”双通道设计, 以保证在资源充足时具备极高执行效率。

函数原型

u8 os_sem_wait(u8 sid);

参数说明

参数 说明
sid 信号量ID(0 ~ OS_RESOURCE_MAX-1)

返回值

WAIT_SIGNAL - 成功立即获取信号量
其他值 - 进入等待状态后的任务ID或调度返回值
0 - 参数非法或获取失败

源码实现

#include "hrtos_internal.h" /* ========================================================= * 信号量 P操作(获取资源) */ u8 os_sem_wait(u8 sid) { OS_RESOURCE *s; u8 tid; if (sid >= OS_RESOURCE_MAX) { return 0; } EA = 0; s = &OS_RES[sid]; /* ------------------------- * 慢路径:无资源 → 进入等待 * ------------------------- */ if(s->value == 0) { EA = 1; tid = os_wait(WAIT_SEM, sid, 0); } /* ------------------------- * 快路径:资源可用 * ------------------------- */ if(s->value > 0) { s->value--; /* 消费资源 */ EA = 1; return WAIT_SIGNAL; } /* ------------------------- * 慢路径返回调度结果 * ------------------------- */ EA = 1; return tid; }

使用示例

void task() { if(os_sem_wait(0) == WAIT_SIGNAL) { // 成功获取资源 } }

注意事项

信号量采用“双通道模型”, 在资源充足时走快路径,在资源不足时进入统一调度等待机制。

相关推荐