os_sem_post
所属模块:同步机制 | 类型:信号量释放函数
函数简介
os_sem_post 用于释放信号量资源,
当存在等待任务时会直接唤醒最高优先级任务,
否则将资源计数进行累加。
该机制实现了“资源直交付模型”,
即优先满足等待任务,而不是累积信号量。
函数原型
char os_sem_post(char sid);
参数说明
| 参数 |
说明 |
| sid |
信号量ID(0 ~ OS_RESOURCE_MAX-1) |
返回值
1 - 成功唤醒等待任务
0 - 无等待任务,资源累加
-1 - 参数非法
源码实现
#include "hrtos_internal.h"
/* =========================================================
* 信号量 V操作(释放资源 + 唤醒任务)
*/
char os_sem_post(char sid)
{
OS_RESOURCE *s;
char next;
char i;
char best_prio;
if(sid < 0 || sid >= OS_RESOURCE_MAX)
{
return -1;
}
EA = 0;
best_prio = -1;
next = OS_INVALID_ID;
s = &OS_RES[sid];
/* -------------------------
* 存在等待任务 → 直接唤醒
* ------------------------- */
if(s->wait_mask)
{
for(i = 0; i < OS_PROCESS_MAX; i++)
{
if(s->wait_mask & ((u16)1 << i))
{
if(OS_TASK[i].cur_prio > best_prio)
{
best_prio = OS_TASK[i].cur_prio;
next = i;
}
}
}
if(next != OS_INVALID_ID)
{
wake_task(next, WAIT_SIGNAL);
}
EA = 1;
return 1;
}
/* -------------------------
* 无等待任务 → 资源累加
* ------------------------- */
if(OS_RES[sid].value < 255)
{
s->value++;
}
EA = 1;
return 0;
}
使用示例
void task()
{
os_sem_post(0);
}
注意事项
信号量释放遵循“优先唤醒等待任务”的原则,
不保证 value 一定累加(取决于是否存在等待任务)。