一、事件组的创建 —— 用于多事件组合的同步
1、包含头文件
#include "event_groups.h" // 事件组核心头文件
2、定义事件组句柄
EventGroupHandle_t xEventGroup; // 事件组句柄
3、定义事件位
为每个事件分配独立的位(通常用宏定义),每个位代表一个事件:
#define EVENT_BIT_0 (1 << 0) // 事件位0(第0位)
#define EVENT_BIT_1 (1 << 1) // 事件位1(第1位)
4、调用创建函数
返回值:成功创建返回事件组句柄,失败(如内存不足)返回NULL。
xEventGroup = xEventGroupCreate();
5、检查创建结果(可选)
if(xEventGroup == NULL) {
// 事件组创建失败,需错误处理
}
二、事件组的基本使用 —— 核心操作是 设置事件位 和 等待事件位
1、设置事件位(触发事件
// 设置EVENT_BIT_0事件位
xEventGroupSetBits(xEventGroup, EVENT_BIT_0);
// 同时设置多个事件位
xEventGroupSetBits(xEventGroup, EVENT_BIT_0 | EVENT_BIT_1);
2、等待事件位(阻塞等待事件)
- 返回值:满足条件的事件位组合(可通过位运算判断具体触发的事件)。
-
事件核心组合逻辑只有 “或”和“与”两种
EventBits_t xEventBits; // 存储获取到的事件位
xEventBits = xEventGroupWaitBits(
xEventGroup, // 目标事件组句柄
EVENT_BIT_0 | EVENT_BIT_1, // 关注的事件位(bit0和bit1)
pdTRUE, // 获取后是否清除事件位(pdTRUE=清除)
pdFALSE, // 等待模式:pdFALSE=任意事件,pdTRUE=所有事件
portMAX_DELAY // 阻塞超时时间(永久等待)
);
3、清除事件位(可选)
若等待时未设置自动清除,可手动清除事件位:
xEventGroupClearBits(xEventGroup, EVENT_BIT_0); // 清除bit0
三、场景和注意事项
典型场景
多事件触发:如 “按键 1 和按键 2 同时按下” 才执行操作(pdTRUE模式);
任意事件触发:如 “按键 1 或按键 2 按下” 就执行操作(pdFALSE模式);
多任务同步:多个任务触发事件,一个任务统一处理事件组合。
核心特性
事件位独立:每个位代表一个事件,
可组合使用; 灵活等待模式:支持 “任意事件” 或 “所有事件” 触发;
自动清除:等待成功后可自动清除事件位,避免重复触发。
四、例子
if((xEventBits & (EVENT_BIT_0 | EVENT_BIT_1)) == (EVENT_BIT_0 | EVENT_BIT_1)) {
// 事件位0和1都被设置(所有事件满足)
} else if(xEventBits & EVENT_BIT_0) {
// 只有事件位0被设置
} else if(xEventBits & EVENT_BIT_1) {
// 只有事件位1被设置
}
759

被折叠的 条评论
为什么被折叠?



