點擊上方,選擇“置頂/星標(biāo)公眾號”
大家好,我是麥鴿。
在嵌入式系統(tǒng)開發(fā)中,事件驅(qū)動架構(gòu)(Event-Driven Architecture)因其高效性和靈活性,已成為處理多任務(wù)、異步操作的重要模式。
今天推薦一個開源項目——lwEVTLwEVT(Lightweight Event Manager),一款開源事件管理庫。

項目地址:https://github.com/MaJerle/lwevt
這是一個簡單的嵌入式系統(tǒng)事件管理器。其主要目的是能夠從應(yīng)用程序的各個模塊發(fā)送各種事件。
應(yīng)用程序可以定義自定義類型和可選的數(shù)據(jù)結(jié)構(gòu),以便將事件發(fā)送給不同的應(yīng)用程序監(jiān)聽器。
這個有點像QT中的信號和槽機制。
跨平臺輕量化設(shè)計
基于C11標(biāo)準(zhǔn)實現(xiàn)的LwEVT僅需數(shù)KB非易失性存儲空間,完全擺脫硬件架構(gòu)依賴。
其核心代碼經(jīng)過高度優(yōu)化,即使在資源受限的8位MCU上也能流暢運行。
靈活事件類型定義
開發(fā)者可通過lwevt_type_t自定義事件類型,支持動態(tài)注冊/注銷事件處理器。
每個事件可攜帶自定義數(shù)據(jù)結(jié)構(gòu),例如傳感器數(shù)據(jù)包或系統(tǒng)狀態(tài)變更信息,實現(xiàn)類型安全的數(shù)據(jù)傳遞。
高效內(nèi)存管理
采用靜態(tài)內(nèi)存分配策略,通過編譯時預(yù)定義事件隊列深度和處理器數(shù)量,完全規(guī)避動態(tài)內(nèi)存分配風(fēng)險。
非阻塞式事件處理
基于先進(jìn)先出的隊列機制,支持中斷上下文安全觸發(fā)事件。
獨特的優(yōu)先級分級機制允許關(guān)鍵事件(如硬件故障報警)優(yōu)先處理,確保系統(tǒng)實時性要求。
具體示例可以參考example;

每個應(yīng)用程序都各不相同,需要使用不同類型的事件及其相關(guān)數(shù)據(jù)。因此,定義lwevt_types.h事件文件至關(guān)重要; 有以下2種方法可以定義事件類型:
基本事件類型LWEVT_TYPE_BASIC
擴展事件類型,其中LWEVT_TYPE_EXT還包括作為事件一部分的數(shù)據(jù)結(jié)構(gòu)
/* Define basic types */
LWEVT_TYPE_BASIC(LWEVT_TYPE_MY_BASIC_1)
LWEVT_TYPE_BASIC(LWEVT_TYPE_MY_BASIC_2)
LWEVT_TYPE_BASIC(LWEVT_TYPE_MY_BASIC_3)
/* Define extended types */
LWEVT_TYPE_EXT(LWEVT_TYPE_MY_EXT_1, struct {?int?par1;?int?par2; } ext1)
LWEVT_TYPE_EXT(LWEVT_TYPE_MY_EXT_2, struct {?int?par3;?int?par4; } ext2)
LWEVT_TYPE_EXT(LWEVT_TYPE_MY_EXT_3, struct {?int?par1;?int?par2; } ext3)
A模塊產(chǎn)生事件,不需要訂閱事件,比如按鍵產(chǎn)生按下的事件;
#include?"lwevt/lwevt.h"
void
produce()?{
? ??lwevt_t* evt;
? ??/* Initialize event management system = must be called only once in the application */
? ? lwevt_init();
? ??
? ??/*
? ? ?* Get event handle, set event data and dispatch event
? ? ?*
? ? ?* Send basic event - without any data
? ? ?*/
? ? evt = lwevt_get_handle();
? ? lwevt_dispatch(LWEVT_TYPE_MY_BASIC_1);
? ??/*
? ? ?* Get event handle, set event data and dispatch event
? ? ?*
? ? ?* Send extended event - with data
? ? ?*/
? ? evt = lwevt_get_handle();
? ? evt->msg.ext1.par1 =?10; ? ?/* Some value */
? ? evt->msg.ext1.par2 =?12; ? ?/* Some value */
? ? lwevt_dispatch(LWEVT_TYPE_MY_EXT_1);
? ??return0;
}
B模塊訂閱事件,涉及調(diào)用lwevt_register()以回調(diào)函數(shù)為參數(shù)的函數(shù)。
所有事件都在回調(diào)函數(shù)prv_evt_fn中處理。A模塊事件會觸發(fā)B模塊的回調(diào)。
#include?"lwevt/lwevt.h"
/* Define event functions */
static?void
prv_evt_fn(lwevt_t* e)?{
? ??printf("Event type: %u\r\n", (unsigned)e->type);
? ??switch?(e->type) {
? ? ? ??case?LWEVT_TYPE_MY_BASIC_1: {
? ? ? ? ? ??printf("Basic event type - no data\r\n");
? ? ? ? ? ??break;
? ? ? ? }
? ? ? ??case?LWEVT_TYPE_MY_EXT_1: {
? ? ? ? ? ??printf("Extended event type - with data: par1: %d, par2: %d\r\n",
? ? ? ? ? ? ? ? (int)e->msg.ext1.par1, (int)e->msg.ext1.par2);
? ? ? ? ? ??break;
? ? ? ? }
? ? ? ??default:
? ? ? ? ? ??break;
? ? }
}
int
main()?{
? ??lwevt_t* evt;
? ??/* Initialize event management system = must be called only once in the application ?*/
? ? lwevt_init();
? ??/* Set 2 custom functions for event */
? ? lwevt_register(prv_evt_fn);
? ??/* Do nothing - events are handled in callback function */
? ??return0;
}
LwEVT對于低資源占用的嵌入式開發(fā)者而言,還是比較使用的,也方便后期項目的擴展和維護(hù)。
如果登不上GitHub,公眾號后臺回復(fù)【LwEVT】獲取項目
??兄弟們!一個人單打獨斗確實能沖得挺快,但要想走得更遠(yuǎn)、更穩(wěn),還得靠一群志同道合的伙伴啊!
?? 麥鴿的知識星球現(xiàn)在已經(jīng)聚集了一波人,大家都在這里互相學(xué)習(xí)、共同進(jìn)步。
如果你也想找個靠譜的學(xué)習(xí)圈子
趕緊???戳鏈接 ???加入我們吧!
在這里,你能讀到星球?qū)诘母韶洠瑑?yōu)質(zhì)教程,練手項目,隨時向麥鴿提問,還能幫你定制學(xué)習(xí)計劃。別猶豫了,兄弟,一起沖!??
往期推薦
別讓技術(shù)思維困在工位!我打算出去看看這些技術(shù)熱點
別再用傳統(tǒng)方法解析串口協(xié)議啦!單片機高效開發(fā)妙招,自定義協(xié)議處理效率翻倍(附源碼)
別讓“屎山”代碼毀了你的項目!這套“低耦合,高內(nèi)聚”的嵌入式框架讓開發(fā)效率提升10倍(附開源工程)
3分鐘上手OSAL移植:TI官方精簡框架+STM32實戰(zhàn)案例(附源碼)