1、信号量的基本使用
- 信号:起通知作用
- 量: 还可以用来表示资源的数量
- 当"量"没有限制时,它就是"计数型信号量"(Counting Semaphores)
- 当"量"只有 0、 1 两个取值时,它就是"二进制信号量"(Binary Semaphores)
- 支持的动作: "give"给出资源,计数值加 1; "take"获得资源,计数值减 1
计数型信号量的典型场景是:- 计数:事件产生时"give"信号量,让计数值加 1;处理事件时要先"take"信
号量,就是获得信号量,让计数值减 1。 - 资源管理:要想访问资源需要先"take"信号量,让计数值减 1;用完资源后
"give"信号量,让计数值加 1
- 计数:事件产生时"give"信号量,让计数值加 1;处理事件时要先"take"信
信号量的本质还是队列,核心是计数值
2、信号量函数
2.1 创建
/* 创建一个二进制信号量,返回它的句柄。
* 此函数内部会分配信号量结构体
* 返回值: 返回句柄,非 NULL 表示成功
*/
SemaphoreHandle_t xSemaphoreCreateBinary( void );
/* 创建一个计数型信号量,返回它的句柄。
* 此函数内部会分配信号量结构体
* uxMaxCount: 最大计数值
* uxInitialCount: 初始计数值
* 返回值: 返回句柄,非 NULL 表示成功
*/
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);
2.2 删除
/*
* xSemaphore: 信号量句柄,你要删除哪个信号量
*/
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
2.3 give / take
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,TickType_t xTicksToWait);