STM32CubeFreeRtos-二值信号量

一、接口介绍

1.1xSemaphoreGive()

参数:信号量句柄。

返回值:pdPASS释放成功。

1.2xSemaphoreTake()

参数1:句柄;

参数2:阻塞时间。

返回值:pdPASS释放成功。

二、程序设计

2.1xSemaphoreTake()阻塞时间配置为0时

osSemaphoreDef(myBinarySem01);
myBinarySem01Handle = osSemaphoreCreate(osSemaphore(myBinarySem01), 1);//Cube配置信号量默认填满
...
void T1(void const * argument)
{
  /* USER CODE BEGIN T1 */
  /* Infinite loop */
  for(;;)
  {
	  Key_Check();
	  if(keyvalue == KEY0) {
		  if(xSemaphoreGive(myBinarySem01Handle) == pdTRUE) {
			  printf("Give complete\r\n");
		  }
		  else {
			  printf("Give error\r\n");
		  }
		  keyvalue = UNKNOW;
	  }
  }
  /* USER CODE END T1 */
}
...
void T2(void const * argument)
{
  /* USER CODE BEGIN T2 */
  /* Infinite loop */
  for(;;)
  {
	  Key_Check();
	  if(keyvalue == KEY1) {
		  if(xSemaphoreTake(myBinarySem01Handle, 0) == pdTRUE) {
			  printf("Take complete\r\n");
		  }
		  else{
			  printf("Take error\r\n");
		  }
		  keyvalue = UNKNOW;
	  }
  }
  /* USER CODE END T2 */
}

运行结果为:

分析:对于第一行二值信号量释放(give)失败是由于Cube配置信号量默认填满,因此第二行取走(take)成功,第三行由于xSemaphoreTake()阻塞时间配置为0时,不可能等,不会卡在if(xSemaphoreTake(myBinarySem01Handle, 0) == pdTRUE)这句话,没东西可取...

2.2xSemaphoreTake()阻塞时间配置为MAX时

void T2(void const * argument)
{
  /* USER CODE BEGIN T2 */
  /* Infinite loop */
  for(;;)
  {
	  Key_Check();
	  if(keyvalue == KEY1) {
		  if(xSemaphoreTake(myBinarySem01Handle, portMAX_DELAY) == pdTRUE) {
			  printf("Take complete\r\n");
			  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
		  }
		  else{
			  printf("Take error\r\n");
		  }
		  keyvalue = UNKNOW;
	  }
  }
  /* USER CODE END T2 */
}

运行结果为:

分析: 对于第一行二值信号量取走完成是由于Cube配置信号量默认填满,第二行释放,第三行取走,此时再按下取走键但没有任何显示,这是由于阻塞时间MAX(一直在这里等着),故卡在了if(xSemaphoreTake(myBinarySem01Handle, portMAX_DELAY) == pdTRUE)这句话,进一步按下释放键串口显示Gake而不是Give且小灯亮起,这是因为程序就在这里阻塞着就在这里等着,这就是意味着释放成功,取走成功两者同时完成,因此串口出错...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值