信号量
信号:起通知作用。
量:表示资源的数量。
当量没有限制时,就是计数型信号量。
当量只有0、1时,就是二进制信号量。
支持的动作:give给出资源,计数值+1;take获得资源,计数值-1。
队列 | 信号量 |
可以容纳多个数据, 创建队列时有2部分内存:队列结构体、存储数据的空间 | 只有计数值,无法容纳其他数据。 创建信号量时,只需要分配信号量结构体 |
生产者:没有空间存入数据时可以阻塞 | 生产者:用于不阻塞,计数值已经达到最大时返回失败 |
消费者:没有数据时可以阻塞 | 消费者:没有数据时可以阻塞 |
二进制信号量 | 计数型信号量 |
被创建时初始值为0 | 被初始化时初始值可以设定 |
其他操作是一样的 | 其他操作是一样的 |
创建信号量
二进制信号量 | 计数型信号量 | |
动态创建 | xSemaphoreCreateBinary计数值初始值为0 | xSemaphoreCreateCounting |
vSemaphoreCreateBinary计数值初始值为1(过时了) | ||
静态创建 | xSemaphoreCreateBinaryStatic | xSemaphoreCreateCountingStatic |
/* 创建一个二进制信号量,返回它的句柄。* 此函数内部会分配信号量结构体* 返回值: 返回句柄,非NULL表示成功
*/
SemaphoreHandle_t xSemaphoreCreateBinary( void );/* 创建一个二进制信号量,返回它的句柄。* 此函数无需动态分配内存,所以需要先有一个StaticSemaphore_t结构体,并传入它的指针* 返回值: 返回句柄,非NULL表示成功
*/
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer );/* 创建一个计数型信号量,返回它的句柄。* 此函数内部会分配信号量结构体* uxMaxCount: 最大计数值* uxInitialCount: 初始计数值* 返回值: 返回句柄,非NULL表示成功
*/
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);/* 创建一个计数型信号量,返回它的句柄。* 此函数无需动态分配内存,所以需要先有一个StaticSemaphore_t结构体,并传入它的指针* uxMaxCount: 最大计数值* uxInitialCount: 初始计数值* pxSemaphoreBuffer: StaticSemaphore_t结构体指针* 返回值: 返回句柄,非NULL表示成功
*/
SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer );
删除信号量
对于动态创建的信号量,不再需要它们时,可以删除它们以回收内存。
vSemaphoreDelete可以用来删除二进制信号量、计数型信号量。
/* xSemaphore: 信号量句柄,你要删除哪个信号量 */
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
give/take
二进制信号量、计数型信号量的give、take操作函数是一样的。也分两个版本:给任务使用、给ISR使用。
在任务中使用 | 在ISR中使用 | |
give | xSemaphoreGive | xSemaphoreGiveFromISR |
take | xSemaphoreTake | xSemaphoreTakeFromISR |