【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 */
}
相关推荐
洋九八1 小时前
STM32 串口(USART)配置
stm32·单片机·嵌入式硬件
华科大胡子1 小时前
单片机IO不够?ULN2003A救急方案
单片机
时空自由民.1 小时前
MCU 串口 printf 耗时优化方案
单片机·嵌入式硬件
金色光环2 小时前
【DSP学习】增强型脉宽调制 EPWM 实验-基于普中DSP开发攻略
单片机·学习·dsp开发
搁浅小泽3 小时前
万用表测试电子元器件
单片机·嵌入式硬件·可靠性工程师
aini_lovee4 小时前
STM32 上实现 SD 卡读取 JPEG 解码 TFT 显示
开发语言·stm32
你刷碗4 小时前
嵌入式UART printf 数据处理方法
c语言·单片机·嵌入式硬件·arm
風清掦4 小时前
【STM32学习笔记-13】PWR电源控制
笔记·stm32·学习
三佛科技-134163842124 小时前
HN03N10D_SOT89封装100V3A N沟道MOSFET场效应管与HN0301的区别
嵌入式硬件·物联网·智能家居·pcb工艺
jghhh014 小时前
基于 STM32 定时器输入捕获功能的数字频率计方案
stm32·单片机·嵌入式硬件