信号管理

  • 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 获得资源
  • 在临界区内被调用
  • 可能离开临界区使当前线程进入等待状态
  • 执行结束后回到临界区

madSemCheck

MadBool madSemCheck (MadSemCB_t **pSem)
1

检查信号量是否可用。

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

madDoSemShut

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

终结信号量

madDoSemShut不释放信号量所占用的内存空间,而是将其返回给调用者。

参数名 方向 说明
pSem in 信号量指针
opt in 是否恢复等待线程
返回值 说明
0 无此信号量
x 终结信号量

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
调用 说明
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
调用 说明
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