os_semaphore_post_from_isr
所属模块:同步机制 | 类型:中断安全信号量函数
函数简介
os_semaphore_post_from_isr 用于在中断上下文中释放信号量资源,
用于通知等待任务资源已可用。
该函数支持“有等待任务”和“无等待任务”两种不同处理路径,
保证系统调度效率与一致性。
函数原型
char os_semaphore_post_from_isr(u8 obj);
参数说明
| 参数 |
说明 |
| obj |
信号量ID(0 ~ OS_RESOURCE_MAX-1) |
源码实现
/*------------------------------------------------------------------------
| FILE DESCRIPTION |
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
| - File name : semaphore_post_from_isr.c
| - Author : 谭舒
| - Update date : 2026-09-19
| - Copyright(C) : 2026 HRTOS. All rights reserved.
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
| INCLUDES |
------------------------------------------------------------------------*/
#include"hrtos_internal.h"
/*------------------------------------------------------------------------
| API FUNCTIONS |
------------------------------------------------------------------------*/
/**
* @brief 在中断环境释放指定信号量。
*
* @param[in] obj 信号量资源槽位编号。
*
* @return 操作结果。
* @retval 1 信号量释放成功。
* @retval -1 信号量资源槽位编号无效。
*
* @note 当存在等待任务时,仅记录待处理信号并请求系统重新进行任务调度,
* 后续由内核统一处理任务唤醒。
* 当没有任务等待时,信号量计数增加 1,最大计数值为 255。
* 该接口用于中断环境。
*/
char os_semaphore_post_from_isr(u8 obj)
{
if (obj >= OS_RESOURCE_MAX)
{
return -1;
}
/* -------------------------
* 有等待任务:仅记录事件
* (唤醒由内核统一处理)
* ------------------------- */
if (OS_RES[obj].wait_cnt > 0)
{
OS_RES[obj].pending_signal++;
/* -------------------------
* 触发调度
* ------------------------- */
OS_SCHED_REASON = 1;
}
else
{
/* -------------------------
* 无等待任务:计数+1
* ------------------------- */
if (OS_RES[obj].value < 255)
{
OS_RES[obj].value++;
}
}
return 1;
}
/*------------------------------------------------------------------------
| END OF FILE: semaphore_post_from_isr.c |
------------------------------------------------------------------------*/
使用示例
void TIMER_ISR(void)
{
os_semaphore_post_from_isr(0);
}
注意事项
ISR版本信号量操作必须避免阻塞逻辑,仅做轻量计数与调度触发。
任务唤醒由内核统一处理。