分享一个2KB的高效事件驱动框架!

strongerHuang 2025-09-26 08:00

关注+星标公众,不错过精彩内容

来源 | 小麦大叔

在嵌入式系统开发中,事件驱动架构(Event-Driven Architecture)因其高效性和灵活性,已成为处理多任务、异步操作的重要模式。

今天推荐一个开源项目——lwEVTLwEVT(Lightweight Event Manager),一款开源事件管理库。

分享一个2KB的高效事件驱动框架!图1
项目主页

项目地址:https://github.com/MaJerle/lwevt

这是一个简单的嵌入式系统事件管理器。其主要目的是能够从应用程序的各个模块发送各种事件。

应用程序可以定义自定义类型和可选的数据结构,以便将事件发送给不同的应用程序监听器。

这个有点像QT中的信号和槽机制。


LwEVT核心特性

跨平台轻量化设计
基于C11标准实现的LwEVT仅需数KB非易失性存储空间,完全摆脱硬件架构依赖。

其核心代码经过高度优化,即使在资源受限的8位MCU上也能流畅运行。

灵活事件类型定义
开发者可通过lwevt_type_t自定义事件类型,支持动态注册/注销事件处理器。

每个事件可携带自定义数据结构,例如传感器数据包或系统状态变更信息,实现类型安全的数据传递。

高效内存管理
采用静态内存分配策略,通过编译时预定义事件队列深度和处理器数量,完全规避动态内存分配风险。

非阻塞式事件处理
基于先进先出的队列机制,支持中断上下文安全触发事件。

独特的优先级分级机制允许关键事件(如硬件故障报警)优先处理,确保系统实时性要求。

示例

具体示例可以参考example;

分享一个2KB的高效事件驱动框架!图2

事件类型

每个应用程序都各不相同,需要使用不同类型的事件及其相关数据。因此,定义lwevt_types.h事件文件至关重要; 有以下2种方法可以定义事件类型:

  • 基本事件类型LWEVT_TYPE_BASIC

  • 扩展事件类型,其中LWEVT_TYPE_EXT还包括作为事件一部分的数据结构

/* 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模块产生事件,不需要订阅事件,比如按键产生按下的事件;

#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模块订阅事件,涉及调用lwevt_register()以回调函数为参数的函数。

所有事件都在回调函数prv_evt_fn中处理。A模块事件会触发B模块的回调。

#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对于低资源占用的嵌入式开发者而言,还是比较使用的,也方便后期项目的扩展和维护。

------------ END ------------


分享一个2KB的高效事件驱动框架!图3


关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。


点击“阅读原文”查看更多分享。

声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。 
驱动
more
低空经济观察丨安徽:构建以应用场景创新为核心驱动、全产业链协同发展的生态系统
分享一个2KB的高效事件驱动框架!
2025年酒店场景机器人服务智能体市场规模、驱动因素及发展趋势
根基可控,智能无限:QNX车规级操作系统驱动汽车电子新时代
《2025年中国数字城市竞争力研究报告》解读一:城市数字化步入“融合深化期”,加速驱动全域价值释放
政府采购驱动低空经济崛起,公共安全应用占比超50%成主力战场
华为超节点:用「一台机器」的逻辑,驱动AI万卡集群
ICCV'25开源 | AnimateAnyMesh:全新3D Animation范式!首个前馈通用mesh驱动框架!
英特尔确认降级 11~14 代处理器核显驱动支持,将按季或按需更新
芯来科技“通用+专用”双轮驱动,重塑国产IP新格局
Copyright © 2025 成都区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号