# 信号管理

TIP

  • MadSemaphore.h
  • MadSemaphore.c
类型 约定描述
MadSemCB_t 信号量控制块
MadSemCB_t* 信号量
MadSemCB_t** 信号量指针

# madSemCreateCarefully

MadSemCB_t* madSemCreateCarefully(MadU16 cnt, MadU16 max)
1

新建信号量。

参数名 方向 说明
cnt in 信号量的初始值
max in 信号量的最大值
返回值 说明
0 失败
NZ 成功(信号量)

# madSemInitCarefully

MadBool madSemInitCarefully(MadSemCB_t *sem, MadU16 cnt, MadU16 max)
1

初始化信号量。

参数名 方向 说明
cnt in 信号量的初始值
max in 信号量的最大值
返回值 说明
MFALSE 失败
MTRUE 成功

# madDoSemRelease

void madDoSemRelease(MadSemCB_t **pSem, MadU8 err)
1

释放一次信号量。

参数名 方向 说明
pSem in 信号量指针
err in 释放信号量时的错误号(通常为MAD_ERR_OK)

# madSemWait

MadU8 madSemWait(MadSemCB_t **pSem, MadTim_t timOut)
1

等待信号量。

参数名 方向 说明
pSem in 信号量指针
timOut in 等待超时的时间值(0则无时限)
返回值 说明
MAD_ERR_x 错误代码
MAD_ERR_OK 获得资源

# madSemWaitInCritical

MadU8 madSemWaitInCritical(MadSemCB_t **pSem, MadTim_t timOut)
1

等待信号量(谨慎使用)。

参数名 方向 说明
pSem in 信号量指针
timOut in 等待超时的时间值(0则无时限)
返回值 说明
MAD_ERR_x 错误代码
MAD_ERR_OK 获得资源

TIP

  • 在临界区内被调用
  • 可能离开临界区使当前线程进入等待状态
  • 执行结束后回到临界区

# madSemCheck

MadBool madSemCheck(MadSemCB_t **pSem)
1

检查信号量是否可用。

参数名 方向 说明
pSem in 信号量指针
返回值 说明
MAD_ERR_x 错误代码
MAD_ERR_OK 获得资源

# madDoSemShut

void madDoSemShut(MadSemCB_t **pSem, MadBool opt)
1

终止信号量(但不释放控制块所占用的内存)。

参数名 方向 说明
pSem in 信号量指针
opt in 是否恢复等待线程

opt

说明
MTRUE 以 MAD_ERR_SEM_INVALID 为 err 释放信号量(恢复所有等待线程)
MFALSE 忽略所有等待线程

# madDoSemDelete

void madDoSemDelete(MadSemCB_t **pSem, MadBool opt)
1

删除信号量。

参数名 方向 说明
pSem in 信号量指针
opt in 是否恢复等待线程

opt

说明
MTRUE 以 MAD_ERR_SEM_INVALID 为 err 释放信号量(恢复所有等待线程)
MFALSE 忽略所有等待线程

# madSemCreate(cnt)

MadSemCB_t*  madSemCreateCarefully(MadU16 cnt, MadU16 max);
1
参数
max cnt

TIP

调用 说明
madSemCreate(cnt) madSemCreateCarefully(cnt, cnt)
madSemCreate(MAD_U16_MAX) 生成资源数“无限”的信号量
madSemCreate(1) 生成互斥信号量
madSemCreate(0) 生成特殊信号量
madSemCreateCarefully(0, 1) 生成初始资源数为 0 的互斥信号量

# madSemCreateN(max)

MadSemCB_t*  madSemCreateCarefully(MadU16 cnt, MadU16 max);
1
参数
cnt 0

TIP

调用 说明
madSemCreateN(cnt) madSemCreateCarefully(0, cnt)

# madSemInit(sem, cnt)

MadBool madSemInitCarefully(MadSemCB_t *sem, MadU16 cnt, MadU16 max)
1
参数
max cnt

# madSemInitN(sem, max)

MadBool madSemInitCarefully(MadSemCB_t *sem, MadU16 cnt, MadU16 max)
1
参数
cnt 0

# madSemRelease(pSem)

void madDoSemRelease(MadSemCB_t **pSem, MadU8 err)
1
参数
err MAD_ERR_OK

# madSemShut(pSem)

void madDoSemShut(MadSemCB_t **pSem, MadBool opt)
1
参数
opt MTRUE

# madSemDelete(pSem)

void madDoSemDelete(MadSemCB_t **pSem, MadBool opt)
1
参数
opt MTRUE