FreeRTOS计数信号量的使用

顾名思义计数信号量的意义就是计数那么如何对计数信号量有一个较深刻的了解呢?

首先我们可以先创建一个任务,在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(句柄);作为读取整个计数的数值可以更加清晰地看出整个实验地现象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值