freerots学习(九)事件标志组

一、什么是事件标志组?

事件标志位 :表明某个事件是否发生,联想:全局变量 flag 。通常按位表示,每一个位表示一个
事件(高 8 位不算)
事件标志组 是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。
事件标志组本质是一个 16 位或 32 位无符号的数据类型 EventBits_t configUSE_16_BIT_TICKS
决定。
虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的高 8 位用作存储事件标志组的
控制信息,低 24 位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志!

二、事件标志组相关 API 函数

1. 创建事件标志组

2. 设置事件标志位

3. 清除事件标志位

4. 等待事件标志位

三、实操

实验需求
创建一个事件标志组和两个任务( task1 task2 ), task1 检测按键,如果检测到 KEY1 KEY2 都按过,则执行 task2

四、cubeMX配置

五、代码实现

/* USER CODE BEGIN Header_fun1 */
/**
  * @brief  Function implementing the task1 thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_fun1 */
void fun1(void *argument)
{
  /* USER CODE BEGIN fun1 */
  /* Infinite loop */
  for(;;)
  {
		if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET)
		{
			osDelay(20);
			while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET);
			osDelay(20);
			printf("KEY1 press down\r\n");
			
			xEventGroupSetBits(myEvent01Handle,0x01);
			
		}
		
		if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET)
		{
			osDelay(20);
			while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET);
			osDelay(20);
			printf("KEY2 press down\r\n");
			
			xEventGroupSetBits(myEvent01Handle,0x02);
		}
  }
  /* USER CODE END fun1 */
}

/* USER CODE BEGIN Header_fun2 */
/**
* @brief Function implementing the task2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_fun2 */
void fun2(void *argument)
{
  /* USER CODE BEGIN fun2 */
  /* Infinite loop */
  for(;;)
  { 
		EventBits_t status;
		//portMAX_DELAY死等

		status=xEventGroupWaitBits(myEvent01Handle,0x03,pdTRUE,pdTRUE,portMAX_DELAY);
	  printf("key1 and key2 press down ,stutus = %d\r\n",status);
		
//		status=xEventGroupWaitBits(myEvent01Handle,0x03,pdTRUE,pdFALSE,portMAX_DELAY);
//	  printf("key1 or key2 press down ,stutus = %d\r\n",status);
  }
  /* USER CODE END fun2 */
}

六、运行效果

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值