os_sem_post

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

API Metadata

函数ID:os_sem_post
模块:semaphore
类型:semaphore post
嵌套深度:2

函数简介

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 一定累加(取决于是否存在等待任务)。

相关推荐