【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 */
}
相关推荐
future14128 小时前
单片机学习日记
单片机·嵌入式硬件·学习
嘿嘿嘿x310 小时前
什么是输入寄存器 什么是输出寄存器 什么是写输入寄存器 什么是读保持寄存器
单片机
hazy1k10 小时前
K230基础-获取触摸坐标
图像处理·stm32·单片机·嵌入式硬件·k230
知南x10 小时前
STM32MP157目标检测环境搭建 (3) NCNN环境安装
stm32·嵌入式硬件·目标检测
日更嵌入式的打工仔11 小时前
InitLWIP() 初始化
笔记·嵌入式硬件·学习
学生董格12 小时前
[嵌入式embed]Keil5-STM32F103C8T6(江协科技)+移植RT-Thread v3.15模版
stm32·嵌入式硬件·rt-thread·keil5·江协科技
酷飞飞13 小时前
掌握DMA基于GD32F407VE的天空星的配置
stm32·单片机·嵌入式硬件·arm
清风66666613 小时前
基于单片机的Boost升压斩波电源电路
单片机·嵌入式硬件·毕业设计·课程设计
qiuiuiu41313 小时前
正点原子RK3568学习日记-GIT
linux·c语言·开发语言·单片机
搞一搞汽车电子19 小时前
单片机的堆\栈\Flash\Ram区别和联系
单片机·嵌入式硬件