os_semaphore_post_from_isr

所属模块:同步机制 | 类型:中断安全信号量函数

API Metadata

函数ID:os_semaphore_post_from_isr
模块:semaphore
类型:isr semaphore post
嵌套深度:1

函数简介

os_semaphore_post_from_isr 用于在中断上下文中释放信号量资源, 用于通知等待任务资源已可用。

该函数支持“有等待任务”和“无等待任务”两种不同处理路径, 保证系统调度效率与一致性。

函数原型

char os_semaphore_post_from_isr(u8 obj);

参数说明

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

返回值

1 - 成功
-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版本信号量操作必须避免阻塞逻辑,仅做轻量计数与调度触发。 任务唤醒由内核统一处理。

相关推荐