semactrl
semactrl 提供硬件信号量控制功能,支持信号量的获取、释放、强制清除与批量释放操作,用于多核或多子系统间的互斥访问与资源同步。
头文件清单
接口清单
| 接口名称 | 功能简述 |
|---|---|
| uapi_sema_init | 初始化SEMA模块 |
| uapi_sema_deinit | 去初始化SEMA模块 |
| uapi_sema_get | 获取信号量锁存 |
| uapi_sema_put | 释放信号量锁存 |
| uapi_sema_force_clear | 强制清除信号量锁存 |
| uapi_sema_clear_all | 释放所有信号量锁存 |
Functions
uapi_sema_init
头文件清单
功能说明
- 初始化SEMA硬件信号量模块,为后续信号量获取、释放、强制清除等操作建立运行环境
- 完成信号量控制器的基础配置
- 需在使用任何信号量操作接口前调用
前置条件
- 调用时序约束:当前接口必须在本模块其他接口之前首先调用
- 依赖关系:当前接口依赖SEMA硬件资源已就绪
uapi_sema_deinit
头文件清单
功能说明
- 去初始化SEMA模块,释放信号量控制器占用的资源
- 完成模块的清理工作
- 去初始化后不应再调用其他信号量操作接口
前置条件
- 调用时序约束:当前接口必须在uapi_sema_init()成功返回后调用
- 依赖关系:SEMA模块已初始化完成
uapi_sema_get
头文件清单
功能说明
- 获取指定索引的信号量锁存,支持超时等待
- 信号量索引非法时直接返回错误码,不执行获取操作
- 获取成功后当前子系统占有该信号量,其他子系统无法获取
前置条件
- 调用时序约束:当前接口必须在uapi_sema_init()成功返回后调用
- 依赖关系:SEMA模块已初始化完成
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sema_index | uint8_t | 信号量索引,指定需要获取的信号量编号 | SEMA_0(0) / SEMA_1(1) / SEMA_2(2) / SEMA_3(3) / SEMA_4(4) / SEMA_6(6) / SEMA_7(7) |
| wait_time_us | uint32_t | 获取信号量锁存的超时等待时间,单位为微秒 | ≥ 0 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 信号量获取成功 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
参考案例
src/drivers/chips/3322/pmu/drivers/pmu_ldo.c#uapi_sema_getsrc/drivers/drivers/driver/lcd/api/comm/lcd_mcu_int.c#uapi_sema_get
uapi_sema_put
头文件清单
功能说明
- 释放指定索引的信号量锁存,解除对该信号量的占用
- 信号量索引非法时直接返回错误码,不执行释放操作
- 释放后其他子系统可获取该信号量
前置条件
- 调用时序约束:当前接口必须在uapi_sema_init()成功返回后调用
- 依赖关系:SEMA模块已初始化完成
- 上下文限制:当前调用方已通过uapi_sema_get()成功获取对应信号量
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sema_index | uint8_t | 信号量索引,指定需要释放的信号量编号 | SEMA_0(0) / SEMA_1(1) / SEMA_2(2) / SEMA_3(3) / SEMA_4(4) / SEMA_6(6) / SEMA_7(7) |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 信号量释放成功 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
参考案例
src/drivers/chips/3322/pmu/drivers/pmu_ldo.c#uapi_sema_putsrc/drivers/drivers/driver/lcd/api/comm/lcd_mcu_int.c#uapi_sema_put
uapi_sema_force_clear
头文件清单
功能说明
- 强制清除指定索引的信号量锁存,无论该信号量是否被其他子系统占用
- 信号量索引非法时直接返回错误码,不执行清除操作
- 用于异常恢复场景,强制释放被其他子系统占用的信号量
前置条件
- 调用时序约束:当前接口必须在uapi_sema_init()成功返回后调用
- 依赖关系:SEMA模块已初始化完成
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sema_index | uint8_t | 信号量索引,指定需要强制清除的信号量编号 | SEMA_0(0) / SEMA_1(1) / SEMA_2(2) / SEMA_3(3) / SEMA_4(4) / SEMA_6(6) / SEMA_7(7) |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 信号量强制清除成功 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
uapi_sema_clear_all
头文件清单
功能说明
- 释放所有信号量锁存,遍历全部有效信号量索引并逐一释放当前子系统已占用的信号量
- 任一释放失败即停止并返回错误
- 用于模块去初始化或系统异常恢复场景,批量释放所有信号量资源
前置条件
- 调用时序约束:当前接口必须在uapi_sema_init()成功返回后调用
- 依赖关系:SEMA模块已初始化完成
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 所有信号量释放成功 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
Type definitions
errcode_t [SDK公共基础类型]
使用说明
用于uapi_sema_get、uapi_sema_put、uapi_sema_force_clear、uapi_sema_clear_all接口的返回值类型
Enumerations
sema_index_t
typedef enum {
SEMA_0 = 0, // for tsensor loadswitch
SEMA_1 = 1,
SEMA_2 = 2,
SEMA_3 = 3,
SEMA_4 = 4,
SEMA_6 = 6,
SEMA_7 = 7,
SEMA_BUTT
}sema_index_t;
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| SEMA_0 | 0 | 信号量0,用于tsensor loadswitch |
| SEMA_1 | 1 | 信号量1 |
| SEMA_2 | 2 | 信号量2 |
| SEMA_3 | 3 | 信号量3 |
| SEMA_4 | 4 | 信号量4 |
| SEMA_6 | 6 | 信号量6 |
| SEMA_7 | 7 | 信号量7 |
| SEMA_BUTT | 8 | 信号量索引边界值,不可作为入参使用 |