【STM32】FreeRTOS事件组学习

事件组(Event Group)

一个任务执行之前需要经过多个条件进行判断,当条件全部满足或多个条件中的某一个条件满足才执行。

实验:创建两个任务,一个事件组,当按键一二三都按过一遍才打印。

实现:FreeRTOS在CubeMX中使用V1版本的时候,没法设置Events,必须手动添加,或者是使用V2版本。

这里使用V1版本,在【STM32】FreeRTOS互斥量学习基础上修改代码实现

第一步:创建事件组

cpp 复制代码
/* USER CODE BEGIN FunctionPrototypes */

//创建事件组

EventGroupHandle_t myEventGroup=NULL;

/* USER CODE END FunctionPrototypes */

第二步,初始化

cpp 复制代码
void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */
  //事件组初始化
  myEventGroup=xEventGroupCreate( );
  xEventGroupClearBits(myEventGroup,0X000);
  /* USER CODE END Init */
 
  /* Create the thread(s) */
  /* definition and creation of Task1 */
  osThreadDef(Task1, StartDefaultTask, osPriorityNormal, 0, 128);
  Task1Handle = osThreadCreate(osThread(Task1), NULL);

  /* definition and creation of Task2 */
  osThreadDef(Task2, StartTask02, osPriorityNormal, 0, 128);
  Task2Handle = osThreadCreate(osThread(Task2), NULL);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

}

第三步,任务一中按键加置位实现

cpp 复制代码
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {

		if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0)
		{
			osDelay(20);
			if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0)
			{
				printf("KEY1\r\n");
				xEventGroupSetBits(myEventGroup,0X001);
				osDelay(2000);
			}
		}
		if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0)
		{
			osDelay(20);
			if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0)
			{
				printf("KEY2\r\n");
				xEventGroupSetBits(myEventGroup,0X010);
				osDelay(2000);
			}
		}
		if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
		{
			osDelay(20);
			if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
			{
				printf("KEY3\r\n");
				xEventGroupSetBits(myEventGroup,0X100);
				osDelay(2000);
			}
		}
  }
  /* USER CODE END StartDefaultTask */
}

第四步,任务二中,任务组检查加打印实现

cpp 复制代码
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
	uint32_t Event=0;
  for(;;)
  {
    Event=xEventGroupWaitBits(myEventGroup,0X111,pdTRUE,pdTRUE,portMAX_DELAY);
		if(Event==0X111)
		{
			printf("OK\r\n");
		}
  }
  /* USER CODE END StartTask02 */
}

现象:观察到,必须KEY1,KEY2,KEY3都按下过才能引发事件组打印OK。

如果KEY1,KEY2,KEY3其中一个按下就可以引发事件组打印OK的话,可以进行以下修改:

cpp 复制代码
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
	uint32_t Event=0;
  for(;;)
  {
    Event=xEventGroupWaitBits(myEventGroup,0X111,pdTRUE,pdFALSE,portMAX_DELAY);
		if(Event==0X111)
		{
			printf("OK\r\n");
		}
  }
  /* USER CODE END StartTask02 */
}
相关推荐
Born_t0ward6 分钟前
基于STM32 的实时FFT处理(Matlab+MDK5)
stm32·嵌入式硬件·matlab·mdk5·快速fft
程序猿阿伟1 小时前
《鸿蒙软总线:基于UDP的数据传输奥秘与优势》
单片机·udp·harmonyos
瓢儿菜20181 小时前
proteus8.17 环境配置
单片机·proteus·环境配置
广药门徒4 小时前
破产计划:openmv烧写UVC.bin直接让openmv作为电脑免驱动摄像头
stm32·单片机·嵌入式硬件
SuperW4 小时前
舵机、震动传感器、超声波使用代码
单片机·嵌入式硬件
SlientICE5 小时前
ESP-IDF 开发框架:探索ESP32的强大底层世界
网络·stm32·单片机·嵌入式硬件·物联网
solomonzw17 小时前
FreeRTOS入门与工程实践-基于STM32F103(一)(单片机程序设计模式,FreeRTOS源码概述,内存管理,任务管理,同步互斥与通信,队列,信号量)
stm32·单片机·嵌入式硬件
菠萝地亚狂想曲20 小时前
STM32_HAL库提高中断执行效率
stm32·单片机·嵌入式硬件
xu_wenming21 小时前
FlashDB 在嵌入式系统中占用硬件资源
c语言·数据库·驱动开发·嵌入式硬件
努力创造奇迹21 小时前
STM32 HAL库 HC-05蓝牙通信实现
stm32·嵌入式硬件·struts