[FreeRTOS] 事件标志组 EventGroup

一,FreeRTOS 基本设置

无设置,cubemx无法自己生成,需自己编写

二,写代码

事件标志组重新定义一下

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
EventGroupHandle_t myEventGroupHandle_1;
/* USER CODE END Variables */

在FreeRTOS创建函数里添加

/* USER CODE BEGIN Init */
	myEventGroupHandle_1 = xEventGroupCreate();
  /* USER CODE END Init */

主控制函数

void StartDefaultTask_KEY(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask_KEY */
  /* Infinite loop */
  for(;;)
  {
	  EventBits_t myEventBits_1;
	  myEventBits_1 = xEventGroupWaitBits(myEventGroupHandle_1,Event_1|Event_2,pdTRUE,pdFALSE,portMAX_DELAY);
	  
	  if(myEventBits_1 & Event_1)
	  {
		  osThreadSuspendAll();
		  printf("事件1 发生 \r\n");
		  osThreadResumeAll();
	  }
	  if(myEventBits_1 & Event_2)
	  {
		  osThreadSuspendAll();
		  printf("事件2 发生 \r\n");
		  osThreadResumeAll();
	  }
	  osDelay(1);
  }
  /* USER CODE END StartDefaultTask_KEY */
}

事件1:

void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
    if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
	  {
		  osDelay(10);
		  if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
		  {
			  osThreadSuspendAll();
			  printf("KEY_1 已经按下\r\n");
			  osThreadResumeAll();
			  xEventGroupSetBits(myEventGroupHandle_1,Event_1);
			  
			  while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
			  {
				  osDelay(10);
			  }
		  }
	  }
      osDelay(1);
  }
  /* USER CODE END StartTask02 */
}

事件2:

void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */
  /* Infinite loop */
  for(;;)
  {
    if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
	  {
		  osDelay(10);
		  if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
		  {
			  osThreadSuspendAll();
			  printf("KEY_1 已经按下\r\n");
			  osThreadResumeAll();
			  xEventGroupSetBits(myEventGroupHandle_1,Event_2);
			  
			  while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9) == 1)
			  {
				  osDelay(10);
			  }
		  }
	  }
      osDelay(1);
  }
  /* USER CODE END StartTask03 */
}

三,结果

总结

就需要两个按键同时按,才有效果

//创建事件标志
#define Event_1 (1<<1)
#define Event_2 (1<<2)

//创建事件句柄
EventGroupHandle_t myEventGroupHandle_1;

//创建事件
myEventGroupHandle_1 = xEventGroupCreate();

//设置事件状态
xEventGroupSetBits(myEventGroupHandle_1,Event_1);

//等待事件
myEventBits_1 = 
 xEventGroupWaitBits(myEventGroupHandle_1,//句柄
                     Event_1|Event_2,//所有事件
                     pdTRUE,//
                     pdTRUE,// pdFALSE ===> 只需满足一个条件即可
                            // pdTRUE  ===> 条件都满足才行
                     portMAX_DELAY);

//判断事件
if(myEventBits_1 & Event_1)
	  {
		  osThreadSuspendAll();
		  printf("事件1 发生 \r\n");
		  osThreadResumeAll();
	  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零零怪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值