FREERTOS_事件组——创建和使用

一、事件组的创建  ——  用于多事件组合的同步

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被设置
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值