硬件信号量(Semaphore)是E2000提供的一个二值信号量模块,支持 32 个硬件信号量。每个信号量包括 UNLOCK 和 LOCKED 两个状态
FSemaphore 驱动程序主要完成 Semaphore 模块的初始化,锁的分配、获取与释放, 相关源文件为:
fsemaphore
.
├── fsemaphore.c
├── fsemaphore.h
├── fsemaphore_g.c
├── fsemaphore_hw.h
└── fsemaphore_sinit.c
以下部分将指导您完成 FSemaphore 驱动的软件配置:
Semaphore控制器配置
typedef struct
{
u32 id; /* Semaphore控制器id */
uintptr base_addr; /* Semaphore控制器基地址 */
} FSemaConfig; /* Semaphore控制器配置 */
Semaphore锁实例
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锁实例 */
Semaphore控制器实例
typedef struct _FSema
{
FSemaConfig config; /* Semaphore控制器配置 */
u32 is_ready; /* Semaphore控制器初始化是否完成 */
FSemaLocker *locker[FSEMA_NUM_OF_LOCKER]; /* Semaphore锁实例,locker[i] == NULL 表示锁尚未分配 */
} FSema; /* Semaphore控制器实例 */
FSEMA_SUCCESS :成功 FSEMA_ERR_NOT_INIT :控制器未初始化 FSEMA_ERR_NO_AVAILABLE_LOCKER :没有空闲的锁可以分配 FSEMA_ERR_LOCK_TIMEOUT :锁被占用,获取锁失败 FSEMA_ERR_NO_PERMISSION :当前角色没有权限操作
const FSemaConfig *FSemaLoopkupConfig(u32 instance_id)
Note:
Input:
Return:
FError FSemaCfgInitialize(FSema *const instance, const FSemaConfig *input_config)
Note:
Input:
Return:
void FSemaDeInitialize(FSema *const instance)
Note:
Input:
Return:
FError FSemaCreateLocker(FSema *const instance, FSemaLocker *const locker)
Note:
Input:
Return:
FError FSemaDeleteLocker(FSemaLocker *const locker)
Note:
Input:
Return:
FError FSemaTryLock(FSemaLocker *const locker, u32 owner, u32 try_times, FSemaRelaxHandler relax_handler)
Note:
Input:
Return:
FError FSemaUnlock(FSemaLocker *const locker, u32 owner)
Note:
Input:
Return:
FError FSemaUnlockAll(FSema *const instance)
Note:
Input:
Return:
boolean FSemaIsLocked(FSemaLocker *locker)
Note:
Input:
Return: