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)(記得自己準備內存)。