2023最新版本 FreeRTOS教程 -7-信号量(计数型)

信号量类似消息队列 但不能传输数据只能传输状态

创建计数型信号量函数

SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);

参数1:uxMaxCount: 最大计数值

参数2:uxInitialCount: 初始计数值

返回值 :NULL或信号量句柄

获取计数型信号量函数

普通任务中 传参为信号量句柄

xSemaphoreTake( SemaphoreHandle_t xSemaphore );

在中断服务函数中

xSemaphoreTakeFromISR( SemaphoreHandle_t xSemaphore );

发送计数型信号量函数

普通任务中

BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );

在中断服务函数中

xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore );

删除计数型信号量函数

void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );

代码验证1

-1- 创建了信号量 最大为3 初值为2

-2- 创建了三个任务 他们都在获取信号量

-3- 因为初值为2 所以只有两个任务能获取并且运行(一次)

在这里插入图片描述
2023最新版本 FreeRTOS教程 -7-信号量(计数型)_第1张图片
2023最新版本 FreeRTOS教程 -7-信号量(计数型)_第2张图片

代码验证2


情况1

任务1开始运行获取信号量结束释放

任务2开始运行获取信号量但不释放

任务3会获取信号量

只会运行任务1和任务2

2023最新版本 FreeRTOS教程 -7-信号量(计数型)_第3张图片


情况2

任务1开始运行获取信号量 结束释放

任务2开始运行获取信号量 结束释放

任务3会获取信号量

所以三个任务都会运行

2023最新版本 FreeRTOS教程 -7-信号量(计数型)_第4张图片

删除计数型信号量函数

查看下方头像

你可能感兴趣的:(STM32软硬件实战,STM32,FreeRTOS,stm32,嵌入式硬件,单片机)