rt-thread/bsp/phytium/libraries/standalone/doc/reference/driver/fsemaphore.md

255 lines
4.7 KiB
Markdown
Raw Normal View History

# FSemaphore 驱动程序
## 1. 概述
硬件信号量Semaphore是E2000提供的一个二值信号量模块支持 32 个硬件信号量。每个信号量包括 UNLOCK 和 LOCKED 两个状态
## 2. 功能
FSemaphore 驱动程序主要完成 Semaphore 模块的初始化,锁的分配、获取与释放,
相关源文件为:
```
fsemaphore
.
├── fsemaphore.c
├── fsemaphore.h
├── fsemaphore_g.c
├── fsemaphore_hw.h
└── fsemaphore_sinit.c
```
## 3. 配置方法
以下部分将指导您完成 FSemaphore 驱动的软件配置:
- 初始化 Semaphore 控制器
- 获取 Semaphore 锁
- 加锁/解锁操作
## 4. 应用示例
### [Semaphore加锁解锁测试](../../../baremetal/example/peripheral/ipc/fsemaphore_test)
## 5. API参考
### 5.1. 用户数据结构
#### FSemaConfig
- Semaphore控制器配置
```c
typedef struct
{
u32 id; /* Semaphore控制器id */
uintptr base_addr; /* Semaphore控制器基地址 */
} FSemaConfig; /* Semaphore控制器配置 */
```
#### FSemaLocker
- Semaphore锁实例
```c
typedef struct
{
u32 index; /* Semaphore锁id */
#define FSEMA_LOCKER_NAME_LEN 32U
char name[FSEMA_LOCKER_NAME_LEN]; /* Semaphore锁的名字 */
u32 owner; /* Semaphore锁的拥有者 */
FSema *sema; /* Semaphore控制器实例 */
} FSemaLocker; /* Semaphore锁实例 */
```
#### FSema
- Semaphore控制器实例
```c
typedef struct _FSema
{
FSemaConfig config; /* Semaphore控制器配置 */
u32 is_ready; /* Semaphore控制器初始化是否完成 */
FSemaLocker *locker[FSEMA_NUM_OF_LOCKER]; /* Semaphore锁实例locker[i] == NULL 表示锁尚未分配 */
} FSema; /* Semaphore控制器实例 */
```
### 5.2 错误码定义
FSEMA_SUCCESS :成功
FSEMA_ERR_NOT_INIT :控制器未初始化
FSEMA_ERR_NO_AVAILABLE_LOCKER :没有空闲的锁可以分配
FSEMA_ERR_LOCK_TIMEOUT :锁被占用,获取锁失败
FSEMA_ERR_NO_PERMISSION :当前角色没有权限操作
### 5.3. 用户API接口
#### FSemaLoopkupConfig
```c
const FSemaConfig *FSemaLoopkupConfig(u32 instance_id)
```
Note:
- 获取Semaphore的默认配置
Input:
- {u32} instance_id, Semaphore的实例id
Return:
- {const FSemaConfig *} Semaphore的默认配置
#### FSemaCfgInitialize
```c
FError FSemaCfgInitialize(FSema *const instance, const FSemaConfig *input_config)
```
Note:
- 初始化Semaphore控制器
Input:
- {FSema} *instance, Semaphore控制器实例
- {FSemaConfig} *input_config, Semaphore控制器配置
Return:
- {FError} FSEMA_SUCCESS 表示初始化成功
#### FSemaDeInitialize
```c
void FSemaDeInitialize(FSema *const instance)
```
Note:
- 去初始化Semaphore控制器
Input:
- {FSema} *instance, Semaphore控制器实例
Return:
-
#### FSemaCreateLocker
```c
FError FSemaCreateLocker(FSema *const instance, FSemaLocker *const locker)
```
Note:
- 分配和创建Semaphore锁
Input:
- {FSema} *instance, Semaphore控制器实例
- {FSemaLocker} *locker, Semaphore锁的实例
Return:
- {FError} FSEMA_SUCCESS 表示分配成功
#### FSemaDeleteLocker
```c
FError FSemaDeleteLocker(FSemaLocker *const locker)
```
Note:
- 强制解除Semaphore锁并删除锁实例
Input:
- {FSemaLocker} *locker, Semaphore锁实例
Return:
- {FError} FSEMA_SUCCESS 表示删除锁成功
#### FSemaTryLock
```c
FError FSemaTryLock(FSemaLocker *const locker, u32 owner, u32 try_times, FSemaRelaxHandler relax_handler)
```
Note:
- 尝试获取Semaphore锁
Input:
- {FSemaLocker} *locker, Semaphore锁的实例
- {u32} owner, 当前尝试获取锁的是谁
- {u32} try_times, 尝试获取的次数
- {FSemaRelaxHandler} relax_handler, 每次尝试获取锁失败后的relax函数
Return:
- {FError} FSEMA_SUCCESS 表示成功获取锁FSEMA_ERR_LOCK_TIMEOUT 表示锁已经被占用
#### FSemaUnlock
```c
FError FSemaUnlock(FSemaLocker *const locker, u32 owner)
```
Note:
- 尝试释放Semaphore锁
Input:
- {FSemaLocker} *locker, Semaphore锁实例
- {u32} owner, 当前尝试释放锁的身份
Return:
- {FError} FSEMA_SUCCESS释放锁成功
#### FSemaUnlockAll
```c
FError FSemaUnlockAll(FSema *const instance)
```
Note:
- 强制解除所有Semaphore锁
Input:
- {FSema} *instance, Semaphore控制器实例
Return:
- {FError} FSEMA_SUCCESS表示强制解锁成功
#### FSemaIsLocked
```c
boolean FSemaIsLocked(FSemaLocker *locker)
```
Note:
- 检查指定Semaphore锁是否处于锁定状态
Input:
- {FSemaLocker} *locker, Semaphore锁实例
Return:
- {boolean} TRUE: 处于锁定状态