点击上方,选择“置顶/星标公众号”

福利干货,第一时间送达

大家好,我是麦鸽。

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

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

项目主页
项目主页

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

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

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

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


LwEVT核心特性

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

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

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

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

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

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

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

示例

具体示例可以参考example;

事件类型

每个应用程序都各不相同,需要使用不同类型的事件及其相关数据。因此,定义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对于低资源占用的嵌入式开发者而言,还是比较使用的,也方便后期项目的扩展和维护。

如果登不上GitHub,公众号后台回复【LwEVT】获取项目

最后

🫵兄弟们!一个人单打独斗确实能冲得挺快,但要想走得更远、更稳,还得靠一群志同道合的伙伴啊!

👊 麦鸽的知识星球现在已经聚集了一波人,大家都在这里互相学习、共同进步。

如果你也想找个靠谱的学习圈子

赶紧   戳链接 🔗 加入我们吧!

在这里,你能读到星球专栏的干货,优质教程,练手项目,随时向麦鸽提问,还能帮你定制学习计划。别犹豫了,兄弟,一起冲!💪

往期推荐

别让技术思维困在工位!我打算出去看看这些技术热点

别再用传统方法解析串口协议啦!单片机高效开发妙招,自定义协议处理效率翻倍(附源码)

别让“屎山”代码毁了你的项目!这套“低耦合,高内聚”的嵌入式框架让开发效率提升10倍(附开源工程)

3分钟上手OSAL移植:TI官方精简框架+STM32实战案例(附源码)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐