os_sem_init
所属模块:同步机制 | 类型:信号量初始化函数
函数简介
os_sem_init 用于初始化信号量资源,
设置初始计数 value,并清空等待队列。
信号量用于实现任务同步与资源计数控制,
支持 P/V 操作模型,是 RTOS 基础同步机制之一。
函数原型
char os_sem_init(u8 sid, char init_val);
参数说明
| 参数 |
说明 |
| sid |
信号量ID(0 ~ OS_RESOURCE_MAX-1) |
| init_val |
初始计数值(资源可用数量) |
源码实现
/*------------------------------------------------------------------------
| FILE DESCRIPTION |
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
| - File name : semaphore_init.c
| - Author : 谭舒
| - Update date : 2026-09-19
| - Copyright(C) : 2026 HRTOS. All rights reserved.
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
| INCLUDES |
------------------------------------------------------------------------*/
#include "hrtos_internal.h"
/*------------------------------------------------------------------------
| API FUNCTIONS |
------------------------------------------------------------------------*/
/**
* @brief 初始化指定的信号量资源。
*
* @param[in] sid 信号量资源槽位编号。
* @param[in] init_val 信号量初始计数值。
*
* @return 操作结果。
* @retval 1 信号量初始化成功。
* @retval -1 信号量资源槽位编号无效。
*
* @note 初始化后设置指定的信号量计数,并清空资源拥有者、
* 等待任务及等待计数。
* 信号量不使用资源拥有者机制。
*/
char os_sem_init(u8 sid, char init_val)
{
OS_RESOURCE *sem;
if(sid >= OS_RESOURCE_MAX)
{
return -1;
}
sem = &OS_RES[sid];
sem->value = init_val; /* 信号量初始计数 */
sem->owner = OS_INVALID_ID; /* 不使用 owner(兼容 mutex 结构) */
sem->wait_mask = 0; /* 清空等待任务位图 */
sem->wait_cnt = 0; /* 兼容字段:当前未使用 */
return 1;
}
/*------------------------------------------------------------------------
| END OF FILE: semaphore_init.c |
------------------------------------------------------------------------*/
使用示例
void system_init()
{
os_sem_init(0, 3);
}
注意事项
信号量初始值决定可用资源数量,
value=0 时任务将进入阻塞等待状态。