STM32CubeFreeRtos-计数信号量

文章介绍了在Cube开发中如何使用计数信号量xSemaphoreGive和xSemaphoreTake进行任务间的同步,讨论了不同阻塞时间对信号量操作的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、cube配置

二、接口介绍:

xSemaphoreGive() and xSemaphoreTake()与二值信号量接口一致,只不过填入的是计数信号量的句柄myCountingSem01Handle。

如果想知道当前的信号量的个数可使用uxSemaphoreGetCount(myCountingSem01Handle)

三、程序编写

3.1当阻塞时间为0时

osSemaphoreDef(myCountingSem01);
myCountingSem01Handle = osSemaphoreCreate(osSemaphore(myCountingSem01), 3);
/*Cube配置生成计数信号量默认填满状态(默认有3个信号量)*/
...
void T4(void const * argument)
{
  /* USER CODE BEGIN T4 */
  /* Infinite loop */
  for(;;)
  {
	  	  Key_Check();
	  	  if(keyvalue == KEY0) {
	  		  if( xSemaphoreGive(myCountingSem01Handle) == pdTRUE) {
	  			  printf("give complete\r\n");
	  		  }
	  		  else {
	  			  printf("give error\r\n");
	  		  }
	  		  keyvalue = UNKNOW;
	  	  }
	  	  if(keyvalue == KEY1) {
	  		  if(xSemaphoreTake(myCountingSem01Handle, 0) == pdTRUE) {
	  			  printf("take complete\r\n");
	  		  }
	  		  else {
	  			  printf("take error\r\n");
	  		  }
	  		  keyvalue = UNKNOW;
	  	  }
  }
  /* USER CODE END T4 */
}

 分析:Cube默认填满因此take成功三次再一次会失败,give连续三次成功因为count为3...

3.2当阻塞时间为MAX时

void T3(void const * argument)
{
  for(;;)
  {
	  Key_Check();
  	  if(keyvalue == KEY0) {
  		  if( xSemaphoreGive(myCountingSem01Handle) == pdTRUE) {
  			  printf("give complete\r\n");
  		  }
  		  else {
  			  printf("give error\r\n");
  		  }
  		  keyvalue = UNKNOW;
  	  }
  }
  /* USER CODE END T3 */
}
...
void T4(void const * argument)
{
  /* USER CODE BEGIN T4 */
  /* Infinite loop */
  for(;;)
  {
	  	  Key_Check();
	  	  if(keyvalue == KEY1) {
	  		  if(xSemaphoreTake(myCountingSem01Handle, portMAX_DELAY) == pdTRUE) {
	  			  printf("take complete\r\n");
	  		  }
	  		  else {
	  			  printf("take error\r\n");
	  		  }
	  		  keyvalue = UNKNOW;
	  	  }
  }
  /* USER CODE END T4 */
}

分析:成功提取三次后再次按下TAKE键由于阻塞时间为portMAX_DELAY故T4任务进入阻塞态一直阻塞,直到接收到新的信号量,接下来按下GIVE键发现串口打印结果为gake说明这边释放那边接收且均成功了两个printf(... complete)语句同时执行,故现在是扯平了的状态因此能够再成功释放信号三次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值