os_sem_wait
所属模块:同步机制 | 类型:信号量获取函数
函数简介
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)
{
// 成功获取资源
}
}
注意事项
信号量采用“双通道模型”,
在资源充足时走快路径,在资源不足时进入统一调度等待机制。