LwEVT轻量够用的广播分发器,microbus是稍大功能更全的事件总线

声明: microbus 与 LwEVT 都是开源项目。microbus 的作者是 Peter Vanderhell,LwEVT 的作者是 Tilen MAJERLE。本文是对两个项目源码做 ARM GCC 编译与资源实测后整理的对比笔记。本文作者不是这些项目的开发者,未参与任何代码贡献。 文中资源数据来自编译实测,工程细节来自对开源代码的分析,不代表本文作者的设计决策。

项目仓库:

结论

两个库都无需堆分配,可直接集成进 Cortex-M 工程。LwEVT 用 170 B 代码和 48 B RAM 完成广播分发:注册回调后 dispatch 逐个调用,携带数据的类型由 X-macro 在编译期生成。microbus 用 972 B 代码和 544 B RAM 提供完整事件总线:话题过滤、通配订阅、payload 拷贝、有界队列、确定性分发、错误码与 ABI 校验。资源差距来自功能差距,两者都在各自定位内把代价花在该花的地方。选型看需求:只要求通知一组回调、偶尔带点数据,LwEVT 够用;需要话题路由、ISR 入队、多实例或错误诊断,选 microbus。

两库结构对比如下:microbus 把订阅表和环形队列放进调用者持有的 mbus_t,按话题过滤分发;LwEVT 用全局静态监听表做广播,监听器自行按 type 过滤。

microbus 与 LwEVT 结构对比

资源占用对比(Cortex-M4 实测)

工具链 arm-none-eabi-gcc 14.3.1,Cortex-M4,-Os,链接 --gc-sections;完整程序为库加对等功能测试程序加 crt0。两库均通过 -Wall -Wextra -Werror 零告警。

指标 microbus LwEVT
库代码(单个 .o,全 API) 972 B 170 B
库静态 RAM 0 B(状态由调用者持有) 48 B(全局单例)
事件对象 mbus_event_t 40 B LwEVT_t 12 B
订阅/监听表 16 槽 × 12 B = 192 B 8 槽 × 4 B = 32 B
完整总线实例 RAM mbus_t 544 B(订阅表 192 + 队列 320 + 杂项 32) 48 B
最小配置 关队列后 1072 B text 关默认句柄后 668 B text
最大函数体 mbus_dispatch 132 B LwEVT_register 60 B

关键解读:microbus 的 544 B RAM 由调用者决定占用位置,放栈或静态都行,关掉队列再省约 328 B;LwEVT 的 48 B 是编译进去就固定的全局量,关默认句柄可降到 36 B。

microbus 的设计收益

LwEVT 的设计收益

选型依据