顾名思义计数信号量的意义就是计数那么如何对计数信号量有一个较深刻的了解呢?
首先我们可以先创建一个任务,在RTOS的基本单位中进行我们的计数信号量的操作。
然后就是打开相应的宏CUBEMX是默认开启的。
但是如果你是移植的代码的话需要开启
#define configSUPPORT_DYNAMIC_ALLOCATION 1
开启成功之后我们就可以到相应的位置进行操作。这里是相关的句柄的定义。
然后就是先创建数字信号量
myCountingSem01Handle=xSemaphoreCreateCounting(10,0);//创建计数信号量最大为10开始基数为0
然后就是进入任务中对任务进行编写
void LED_Task1(void *argument)
{
/* USER CODE BEGIN LED_Task1 */
/* Infinite loop */
while(1)
{
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_10)==0)
{
vTaskDelay(20);
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_10)==0)
{
// status=xQueueSendToBack(myQueue01Handle,&buf,0);
if(xSemaphoreGive(myCountingSem01Handle)==pdPASS)
{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_RESET);
vTaskDelay(100);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_SET);
}
while (HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_10)==0);
}
vTaskDelay(20);
}
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_9)==0)
{
vTaskDelay(20);
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_9)==0)
{
// status=xQueueSendToBack(myQueue01Handle,&buf,0);
if(xSemaphoreTake(myCountingSem01Handle,0)==pdPASS)
{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_RESET);
vTaskDelay(100);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_SET);
}
while (HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_10)==0);
}
}
}
/* USER CODE END LED_Task1 */
}
然后就是编译下载,观察现象。可以看出就是按键0按下多少下按键1就能接收多少下。
以成功实现它的的计数信号量的功能。
如果觉得不明白的可以再创建一个任务,然后用这个任务进行相应的操作。
使用uxSemaphoreGetcount(句柄);作为读取整个计数的数值可以更加清晰地看出整个实验地现象。