STM32 HAL freertos零基础(六)计数型信号量

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与二值信号量一样,都默认给了写入。

 测试如下:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值