跳转至

semactrl

semactrl 提供硬件信号量控制功能,支持信号量的获取、释放、强制清除与批量释放操作,用于多核或多子系统间的互斥访问与资源同步。

头文件清单

#include "include/driver/semactrl.h"

接口清单

接口名称 功能简述
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

void uapi_sema_init(void)

头文件清单

#include "include/driver/semactrl.h"

功能说明

  • 初始化SEMA硬件信号量模块,为后续信号量获取、释放、强制清除等操作建立运行环境
  • 完成信号量控制器的基础配置
  • 需在使用任何信号量操作接口前调用

前置条件

  • 调用时序约束:当前接口必须在本模块其他接口之前首先调用
  • 依赖关系:当前接口依赖SEMA硬件资源已就绪

uapi_sema_deinit

void uapi_sema_deinit(void)

头文件清单

#include "include/driver/semactrl.h"

功能说明

  • 去初始化SEMA模块,释放信号量控制器占用的资源
  • 完成模块的清理工作
  • 去初始化后不应再调用其他信号量操作接口

前置条件

  • 调用时序约束:当前接口必须在uapi_sema_init()成功返回后调用
  • 依赖关系:SEMA模块已初始化完成

uapi_sema_get

errcode_t uapi_sema_get(uint8_t sema_index, uint32_t wait_time_us)

头文件清单

#include "include/driver/semactrl.h"

功能说明

  • 获取指定索引的信号量锁存,支持超时等待
  • 信号量索引非法时直接返回错误码,不执行获取操作
  • 获取成功后当前子系统占有该信号量,其他子系统无法获取

前置条件

  • 调用时序约束:当前接口必须在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 执行失败

参考案例

uapi_sema_put

errcode_t uapi_sema_put(uint8_t sema_index)

头文件清单

#include "include/driver/semactrl.h"

功能说明

  • 释放指定索引的信号量锁存,解除对该信号量的占用
  • 信号量索引非法时直接返回错误码,不执行释放操作
  • 释放后其他子系统可获取该信号量

前置条件

  • 调用时序约束:当前接口必须在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 执行失败

参考案例

uapi_sema_force_clear

errcode_t uapi_sema_force_clear(uint8_t sema_index)

头文件清单

#include "include/driver/semactrl.h"

功能说明

  • 强制清除指定索引的信号量锁存,无论该信号量是否被其他子系统占用
  • 信号量索引非法时直接返回错误码,不执行清除操作
  • 用于异常恢复场景,强制释放被其他子系统占用的信号量

前置条件

  • 调用时序约束:当前接口必须在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

errcode_t uapi_sema_clear_all(void)

头文件清单

#include "include/driver/semactrl.h"

功能说明

  • 释放所有信号量锁存,遍历全部有效信号量索引并逐一释放当前子系统已占用的信号量
  • 任一释放失败即停止并返回错误
  • 用于模块去初始化或系统异常恢复场景,批量释放所有信号量资源

前置条件

  • 调用时序约束:当前接口必须在uapi_sema_init()成功返回后调用
  • 依赖关系:SEMA模块已初始化完成

返回值

返回值 文字含义 触发场景
ERRCODE_SUCC(0x00) 执行成功 所有信号量释放成功
Other 其他错误码,参考errcode_t 执行失败

Type definitions

errcode_t [SDK公共基础类型]

typedef uint32_t errcode_t;

使用说明

用于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 信号量索引边界值,不可作为入参使用

Macros

ERRCODE_SUCC [SDK公共共享宏]

#define ERRCODE_SUCC                                        0UL

ERRCODE_SEMA_INVALID_INDEX

#define ERRCODE_SEMA_INVALID_INDEX                  0x80001D00  /* return when sem index invalid. */

ERRCODE_SEMA_REG_ADDR_INVALID

#define ERRCODE_SEMA_REG_ADDR_INVALID               0x80001D01  /* return when get sema regs addr failed. */