EventOS:面向MCU的事件驱动框架

一、EventOS是什么

EventOS是一个面向单片机(MCU)、主打事件驱动超轻量级的开源嵌入式开发框架。它特别适合在资源受限的MCU上,帮助你构建结构清晰、模块解耦且易于维护的应用程序。

EventOS的事件驱动框架

二、EventOS核心特性

  • 事件驱动与事件总线 :EventOS的核心思想是事件驱动。应用程序的各个模块(通常实现为状态机)之间不直接调用函数,而是通过发送和接收"事件"来进行通信。你可以把事件想象成一条带有"主题"和"数据"的消息。这种"主题+数据"的事件设计,能极大降低模块间的依赖关系(耦合)。

  • 协作式内核 :EventOS采用协作式内核设计,这意味着当前运行的任务会一直执行,直到它主动释放CPU控制权,下一个任务才会开始。这样做的好处是避免了资源竞争,无需复杂的互斥锁等机制,使得系统运行非常可靠。

  • 极致的轻量与可裁剪性 :EventOS在设计上极度关注资源占用。除了事件总线这一核心外,其他所有高级功能(如层次状态机、发布-订阅机制、事件携带数据等)都可以通过配置文件 eventos_config.h 一键裁剪。这使得你可以根据项目需求,将框架精简到极致

  • 防御式编程与可靠性 :框架内部使用了大量的断言(assert) ,用于检查系统运行和用户调用的合法性

    。这能帮助开发者快速定位问题,让代码更快地达到稳定状态。

三、文档与博客

EventOS的移植和入门,在documentation文件夹里,可以参考以下几个文档:

(1)快速入门文档

https://gitee.com/event-os/eventos/blob/master/documentation/UM-02-001-QuickStart.md

(2)裸机移植文档

https://gitee.com/event-os/eventos/blob/master/documentation/UM-02-002-PortMetal.md

(3)开发环境搭建

https://gitee.com/event-os/eventos/blob/master/documentation/UM-02-003-DevEnv.md

(4)如何理解事件

https://gitee.com/event-os/eventos/blob/master/blog/如何理解事件.md

四、为什么叫做EventOS

EventOS真的非常轻量。全功能的EventOS目前经MDK编译后,框架本身占用RAM 200Byte,ROM约3.5KB(优化等级为-O3)或4.5KB(优化等级为-O0)。

裁剪后,最小功能的EventOS,目前经MDK编译后,框架本身占用RAM 172Byte,ROM约1.2KB(优化等级为-O3)或1.5KB(优化等级为-O0)。

之所以叫EventOS,一是因为它的技术特色与核心思想,就是事件驱动;二是因为它是另外一个开源项目EventOS(准备中)的简化实现,

EventOS是一个事件驱动的、分布式的、可跨平台开发的嵌入式RTOS,面向32位单片机和更高处理器的嵌入式开发平台。

五、EventOS主张的编程思想

事件驱动与事件总线

事件驱动和事件总线,是EventOS的核心,也是EventOS的核心。事件机制,与RTOS中事件概念完全不同,它更像是windows编程中的消息。

事件,可以认为是主题 + 不定长数据,通过事件,可以极大解耦模块间的耦合,增强软件的可测试性,还可以进行跨平台开发和分布式扩展。

防御式编程

EventOS使用了大量的断言,对系统的运行过程和用户对EventOS的使用进行大量的检查。

我们强烈建议,用户要对断言接口函数进行精心的设计和实现,在实际的产品代码中,依然打开断言。这样,软件将以非常快的速度,收敛于稳定状态。

跨平台开发

EventOS提倡跨平台开发。所谓跨平台开发,就是在Windows和Linux等便捷友好的开发环境里,完成绝大部分的开发工作,包括编程、调试、运行和单元测试等工作,然后在目标平台上进行最后的移植、调试和适配工作。

跨平台的优点有很多,比如开发效率非常高、工程师进入到更多的编程领域和程序稳定可靠等。EventOS主要在32位MinGW平台和Linux平台上开发。

开发环境的搭建,见文档开发环境搭建。当然,也完全可以用MDK在单片机上直接开发,效率稍低而已。

消除耦合

无论是广播式的事件发送机制,还是发布-订阅式的事件发送机制,实际上,都是为了消除软件模块间的耦合。

六、如何使用EventOS

  1. 获取源码 :项目主要托管在Gitee上,你可以访问**https://gitee.com/event-os/eventos**获取最新源代码。

  2. 开始移植 :EventOS的移植过程被设计得尽可能简单。通常,你只需要实现少数几个平台接口函数即可。可以参考项目自带的**stm32f030** 或**stm32f103**等裸机例程。

  3. 编写应用:在你的应用程序中,你将主要与状态机和事件打交道。基本步骤包括:

    • 初始化EventOS框架。

    • 创建你的状态机(功能模块)。

    • 在状态机中处理接收到的事件。

    • 从主函数启动EventOS的事件调度循环。

  4. 跨平台开发 :EventOS鼓励跨平台开发 模式。你可以先在Windows(使用MinGW)或Linux这类友好的开发环境中,完成绝大部分的编码、调试甚至单元测试工作,最后再移植到目标MCU上进行最终适配,这可以显著提升开发效率。

七、代码结构

核心代码

  • eventos/eventos.c EventOS 状态机框架的实现

  • eventos/eventos.h 头文件

  • eventos/eventos_config.h 对EventOS进行配置与裁剪

第三方代码库

  • RTT Segger JLink所提供的日志库,依赖于JLink硬件。

  • unity 单元测试框架

例程代码

  • freertos 对FreeRTOS的适配例程(未完成)。

  • posix 对符合POSIX标准的操作系统(如Linux、VxWork、MinGW等)的适配例程。

  • stm32f030 对ARM Cortex-M0芯片的裸机运行(无RTOS)的例程。

  • stm32f103 对ARM Cortex-M3芯片的裸机运行(无RTOS)的例程。

  • test 对源码进行的单元测试例程。

  • digital_watch 电子表例程,状态机的典型应用。

八、EventOS对比

特性维度 EventOS Nano (核心版本) EventOS Basic (极简协作式内核)
项目定位 事件驱动框架,核心是事件总线 超级简洁的协作式内核
核心特性 事件驱动、状态机、软定时器、深度可裁剪 协作式调度、轻量级任务、软定时器
资源占用 全功能: ROM≈3.5KB, RAM≈200B 最小配置: ROM≈1.2KB, RAM=172B ROM=968字节, RAM=64字节
事件机制 支持广播、发布-订阅两种模式 不涉及事件总线
适用场景 中小资源单片机、作为子系统嵌入、高可靠性场景 对资源极度敏感,无需复杂事件通信的场景
相关推荐
赋能大师兄3 天前
嵌入式软件的几种程序架构
rtos·事件驱动·前后台系统·时间片轮询·面向对象/组件化
poemyang17 天前
职责分离的艺术:剖析主从Reactor模型如何实现极致的并发性能
rpc·reactor·事件驱动
poemyang18 天前
从C10K到Reactor:事件驱动,如何重塑高并发服务器的网络架构
rpc·reactor·事件驱动
可惜我是水瓶座__22 天前
[Spark] 事件总线机制
事件总线·spark内核
程序员老刘·1 个月前
2025年Flutter状态管理新趋势:AI友好度成为技术选型第一标准
flutter·ai编程·跨平台开发·客户端开发
程序员老刘·1 个月前
Flutter版本选择指南:避坑3.27 | 2025年9月
flutter·跨平台开发·客户端开发
带刺的坐椅2 个月前
DamiBus v1.1.0 发布(给单体多模块解耦)
java·事件总线·damibus
Nerd Nirvana2 个月前
C++编程——异步处理、事件驱动编程和策略模式
开发语言·c++·策略模式·嵌入式开发·事件驱动·异步处理
伍哥的传说2 个月前
Uni-App + Vue onLoad与onLaunch执行顺序问题完整解决方案 – 3种实用方法详解
javascript·vue.js·uni-app·事件总线·onlaunch·onload·promise状态管理