- 创建或获取一个事件组句柄。
- 使用xEvetnGroupSync函数等待指定的事件位。可以设置需要等待的事件位、需要设置的事件位和等待超时时间。
- 根据返回值判断等待是否成功,根据已发生的事件位执行相应的操作。
注意,xEvetnGroupSync函数是一个阻塞函数,即在等待期间会阻塞当前任务的执行。如果有其他任务在等待相同的事件组,则它们可能会被唤醒以执行后续操作。因此,在使用xEvetnGroupSync函数时需要谨慎设计,以避免出现死锁或优先级反转等问题。
2.3 功能实现
STM32CubeMX功能配置
GPIO略
根据接口说明 ,事件标志组中断中需要开启守护任务
按键中断及事件标志组创建
//freertos.c
//...略
#include "event_groups.h"
EventGroupHandle_t KeyEventGroup; //全局变量句柄
void MX_FREERTOS_Init(void) {
//创建
KeyEventGroup = xEventGroupCreate();
if(KeyEventGroup == NULL){
printf("KeyEventGroup Create Error\r\n");
}
//...略
}
按键检测任务和蜂鸣器报警任务
//gpio.c
#include "event_groups.h"
//...略
/*
#define KEY3_EVENT_BIT (1<<0)
#define KEY4_EVENT_BIT (1<<1)
#define KEY5_EVENT_BIT (1<<2)
#define KEY6_EVENT_BIT (1<<3)
typedef enum
{
KEY_DOWN,
KEY_UP,
KEY_RESET
}teKeyStatus;
*/
teKeyStatus KeyStatus;
extern EventGroupHandle_t KeyEventGroup;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(Key3_Pin == GPIO_Pin)
{
if(HAL_GPIO_ReadPin(Key3_GPIO_Port,Key3_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(Key3_GPIO_Port,Key3_Pin) == GPIO_PIN_RESET)
{
//设置事件
xEventGroupSetBitsFromISR(KeyEventGroup,KEY3_EVENT_BIT,NULL);
}
}
}
if(Key4_Pin == GPIO_Pin)
{
if(HAL_GPIO_ReadPin(Key4_GPIO_Port,Key4_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(Key4_GPIO_Port,Key4_Pin) == GPIO_PIN_RESET)
{
//设置事件
xEventGroupSetBitsFromISR(KeyEventGroup,KEY4_EVENT_BIT,NULL);
}
}
}
if(Key5_Pin == GPIO_Pin)
{
if(HAL_GPIO_ReadPin(Key5_GPIO_Port,Key5_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(10);
if(HAL