1. xEventGroupCreate ():动态创建(临时借内存)
作用:
向系统(FreeRTOS 的堆内存)“临时申请” 一块内存来存放事件组,不需要我们自己提前准备内存。
例子(基于你的代码修改):
#include "FreeRTOS.h"
#include "event_groups.h"// 定义事件组句柄(相当于"记录本的编号")
EventGroupHandle_t DoorEventGroup;void InitSystem() {// 动态创建事件组:向系统申请内存DoorEventGroup = xEventGroupCreate();// 检查是否创建成功(可能申请内存失败)if (DoorEventGroup == NULL) {printf("创建失败!系统内存不够了\n");} else {printf("创建成功!用的是系统临时分配的内存\n");}
}
特点:
简单方便:只需要调用函数,不用自己管内存细节。
有失败风险:如果系统内存(堆)不够,会返回NULL(申请失败)。
内存会自动管理:不需要时系统会回收(但 FreeRTOS 中事件组一般不会主动释放,需要手动处理)。
2. xEventGroupCreateStatic (&EventBuf):静态创建(自己准备内存)
作用:
不向系统申请内存,而是用我们自己提前 “买好” 的内存(静态内存)来存放事件组,需要手动提供一块内存缓冲区。
例子(对比动态创建):
#include "FreeRTOS.h"
#include "event_groups.h"// 1. 自己准备一块内存(相当于"自己买的房间")
// 类型必须是StaticEventGroup_t,这是FreeRTOS规定的
StaticEventGroup_t EventBuf; // 静态内存缓冲区// 2. 事件组句柄(记录本编号)
EventGroupHandle_t DoorEventGroup;void InitSystem() {// 静态创建事件组:使用自己准备的EventBuf内存DoorEventGroup = xEventGroupCreateStatic(&EventBuf);//创建时需要自己给一个事件内存,如最上面// 静态创建几乎不会失败(只要EventBuf是有效的)printf("创建成功!用的是自己提前准备的内存\n");
}
特点:
需要手动准备内存:必须定义一个StaticEventGroup_t类型的变量(如EventBuf),作为内存缓冲区。
可靠性高:只要提前准备了内存,就一定能创建成功,不会因为 “系统内存不足” 失败。
内存地址固定:内存是编译时就分配好的(放在全局区),地址不会变,适合对内存位置有要求的场景。
区别:
为什么需要两种方式?
动态创建(xEventGroupCreate())适合快速开发,不用关心内存细节,但在内存小的设备(如单片机)上可能不可靠。
静态创建(xEventGroupCreateStatic())适合资源受限的嵌入式系统,比如单片机内存很小,必须精确控制内存使用,避免 “突然没内存” 的问题。
一句话总结
想简单快捷,不怕偶尔内存不够?用 xEventGroupCreate()。
设备内存小,要求必须创建成功?用 xEventGroupCreateStatic(&EventBuf)(记得自己准备内存)。