# 信号管理
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 |