os_sem_init

所属模块:同步机制 | 类型:信号量初始化函数

API Metadata

函数ID:os_sem_init
模块:semaphore
类型:semaphore init
嵌套深度:1

函数简介

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 初始计数值(资源可用数量)

返回值

1 - 初始化成功
-1 - 参数非法

源码实现

/*------------------------------------------------------------------------ | 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 时任务将进入阻塞等待状态。

相关推荐