【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 */
}
相关推荐
晶振厂家-晶发电子2 天前
晶振在5G时代的角色:高精度时钟的核心支撑
单片机·嵌入式硬件·5g·晶振·电子元器件·晶振知识
F137298015572 天前
WD5030A 芯片,12V降5V,输出电流12A,电路设计
stm32·单片机·嵌入式硬件·汽车·51单片机
小莞尔2 天前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
三佛科技-187366133972 天前
分享机械键盘MCU解决方案
单片机·嵌入式硬件·计算机外设
李永奉2 天前
51单片机-使用IIC通信协议实现EEPROM模块教程
单片机·嵌入式硬件·51单片机
工大一只猿2 天前
51单片机学习
嵌入式硬件·学习·51单片机
小莞尔2 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
风_峰2 天前
Ubuntu Linux SD卡分区操作
嵌入式硬件·ubuntu·fpga开发
bing_feilong2 天前
STM32精准控制水流
单片机·嵌入式硬件
Hello_Embed2 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件