一、计数型信号量
什么是计数型信号量?
计数型信号量相当于队列长度大于
1
的队列,因此计数型信号量能够容纳多个资源,这在计数型
信号量被创建的时候确定的。
计数型信号量相关 API 函数
计数型信号量的释放和获取与二值信号量完全相同 !
![](https://img-blog.csdnimg.cn/direct/66c1c9711ac74209b4b03e3782fe9893.png)
二、实操
实验需求
创建一个计数型信号量,按下
KEY1
则释放信号量,按下
KEY2
获取信号量。
三、cubeMX配置
四、代码实现
/* USER CODE BEGIN Header_takeSem_fun */
/**
* @brief Function implementing the takeSem_task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_takeSem_fun */
void takeSem_fun(void *argument)
{
/* USER CODE BEGIN takeSem_fun */
/* Infinite loop */
for(;;)
{
//按键一按下
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET)
{
//消抖
osDelay(20);
//检测松手
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET);
//松手消抖
osDelay(20);
printf("KEY1 press down\r\n");
//获取信号量
if(xSemaphoreTake(myCountingSem01Handle,portMAX_DELAY)==pdPASS){
printf("take semaphore succuse\r\n");
}
else{
printf("take semaphore error\r\n");
}
}
}
/* USER CODE END takeSem_fun */
}
五、运行效果
![](https://img-blog.csdnimg.cn/direct/38a65156af0e44fcbb0549601b497f05.png)