1、计数型信号量
计数型信号量(Counting Semaphore)是另一种类型的信号量,它可以保持一个大于等于0的整数值,这个值表示可用资源的数量。本质上相当于队列长度大于1得队列。经典问题就是剩余车辆统计,出入车辆,车辆数据可以实时更新。
2、相关API函数
xSemaphoreCreateCounting() //使用动态方法创建计数型信号量。
xSemaphoreCreateCountingStatic() //使用静态方法创建计数型信号量
uxSemaphoreGetCount() //获取信号量的计数值
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount,
UBaseType_t uxInitialCount);
uxMaxCount:可以达到的最大计数值 uxInitialCount:
创建信号量时分配给信号量的计数值
返回值: 成功,返回对应计数型信号量的句柄; 失败,返回 NULL 。
3、STM32CubeMX配置
首先确定将Config parameters 内 USE_COUNTING_SEMAPHORES 为 Enabled 。

接着Timers and Semaphores -> Add -> OK
生成程序。
4、KEIL 5配置
计数型信号量释放和获取与二值信号量一样,因此直接放测试代码:
4.1 计算信号量写入
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
uint16_t buf = 100;
BaseType_t status;
/* Infinite loop */
for(;;)
{
if(sign_1==1){
status = xSemaphoreGive(myCountingSem01Handle);
if (status == pdTRUE){
printf("计数信号量放入成功");
}
else{
printf("计数信号量放入失败\r\n");
}
sign_1=0;
}
osDelay(1);
}
/* USER CODE END StartDefaultTask */
}
4.2 计算信号量获取
void StartTask02(void *argument)
{
/* USER CODE BEGIN StartTask02 */
uint16_t buf;
BaseType_t status;
/* Infinite loop */
for(;;)
{
if(sign_1==2){
status = xSemaphoreTake(myCountingSem01Handle,0);
if (status == pdTRUE){
printf("计数信号量获取成功");
}
else{
printf("计数信号量获取失败\r\n");
}
sign_1=0;
}
osDelay(1);
}
/* USER CODE END StartTask02 */
}
4.3 测试
需要注意:STM32CubeMX默认初始值为 2与二值信号量一样,都默认给了写入。

测试如下:

上文如有错误,恳请各位大佬指正!
3234

被折叠的 条评论
为什么被折叠?



