最近有幸接触到了一款新的开源 RTOS 项目,这个项目与传统的 RTOS 不太一样,它是以事件驱动为核心的 RTOS。因此,这个项目的名字为 EventOS。不同于传统的 RTOS 以时钟节拍为驱动核心。
在发布不足一个月的时间,就晋级为 Gitee 推荐项目,目前获得了 216 stars。未来可期~
项目地址:
https://gitee.com/event-os
怎样才能做出这个项目
作者大佬的原话:
说实话,是兴趣爱好,再加几十万行代码的磨练。还要主导架构过10万代码级别的大项目。
果然,大佬就是大佬。抓紧时间,多跟优秀的前辈学习吧。
简介
EventOS 将以事件总线、分布式技术和跨平台开发为产品特色,打造一个完整的技术生态,为广大企业用户和嵌入式开发者们,提供高可靠、高效率、高性能的开发平台。
EventOS 是一个事件驱动的、分布式的、可跨平台开发的嵌入式RTOS,面向32位单片机和更高处理器的嵌入式开发平台。
截至目前,作者发布了两个版本,分别是:
EventOS Nano 支持事件驱动、面向对象、状态机框架,以事件驱动和轻量为特色。定位于熟悉事件驱动与状态机框架,或者感兴趣的用户。
EventOS Basic 支持传统的任务模式,以协作内核、简洁和超轻量为特色,不涉及事件驱动,不强制面向对象,不增加复杂特性。定位于解决简单应用的并发问题。
其中,eventos-nano 版本 开源不到一个月,就被评为推荐项目。yyds。连作者都表示出乎意料。
eventos-basic 版本是作者刚刚开源的,比 eventos-nano 还轻量,基于协作式的内核。
eventos-nano
之所以叫 Nano,是因为它真的非常轻量。全功能的 EventOS Nano 目前经MDK编译后,框架本身占用 RAM 200 Byte,ROM 约 3.5KB(优化等级为-O3)或 4.5KB(优化等级为 -O0)。裁剪后,最小功能的 EventOS Nano,目前经 MDK 编译后,框架本身占用RAM 172Byte,ROM约1.2KB(优化等级为-O3)或1.5KB(优化等级为-O0)。
之所以叫 EventOS Nano,一是因为它的技术特色与核心思想,就是事件驱动;二是因为它是另外一个开源项目EventOS 的简化实现。
EventOS Nano 引入了多个概念,比如面向对象、事件驱动、控制反转等等。不要怕新概念,多方面充实自己。
代码结构
核心代码
核心代码非常简洁,就三个文件:
eventos/eventos.c EventOS Nano状态机框架的实现
eventos/eventos.h 头文件
eventos/eventos_config.h 对EventOS Nano进行配置与裁剪
第三方代码库
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 Nano 的主要特性:
事件总线为核心组件,灵活易用,是进行线程(状态机)间同步或者通信的主要手段,也是对EventOS分布式特性和跨平台开发进行支持的唯一手段。
全局事件队列,摒弃每个线程(状态机)拥有自己的事件队列的方式,只有一个全局事件队列,极限压缩对RAM的占用。
协作式内核,优点是不会产生资源竞争,极度可靠。
极度轻量,便于嵌入其他系统,除事件总线外的所有特性(层次状态机、平面状态机、发布-订阅机制、事件携带数据、事件桥等)均可裁剪,将资源占用降至极限。
功能强大的软定时器,以时间事件的形式,对软定时器功能,进行优雅且功能强大的实现。
API 设计得更加简明,更加符合本土嵌入式工程师的习惯。
移植方便,只需实现少数几个接口函数即可。
未来会使用 Event Bridge(事件桥)机制与 **EventOS **打通事件总线,以便对 EventOS 的分布式特性进行支持。
重点关注三种应用场景:中小资源单片机,作为模块向其他软件系统的嵌入、可靠性要求较高的嵌入式场景。
编程思想
1. 事件驱动与事件总线
事件驱动和事件总线,是 EventOS Nano 的核心,也是 EventOS 的核心。事件机制,与 RTOS 中事件概念完全不同,它更像是 windows 编程中的消息。事件,可以认为是主题 + 不定长数据,通过事件,可以极大解耦模块间的耦合,增强软件的可测试性,还可以进行跨平台开发和分布式扩展。
2. 防御式编程
EventOS Nano 使用了大量的断言,对系统的运行过程和用户对 EventOS Nano 的使用进行大量的检查。在实际的产品代码中,打开断言。软件将以非常快的速度,收敛于稳定状态。
3. 跨平台开发
EventOS Nano 提倡跨平台开发。跨平台的优点有很多,比如开发效率非常高、工程师进入到更多的编程领域和程序稳定可靠等。EventOS Nano 主要在 32 位 MinGW 平台和 Linux 平台上开发。开发环境的搭建,见文档开发环境搭建。当然,也完全可以用MDK在单片机上直接开发,效率稍低而已。
4. 消除耦合
无论是广播式的事件发送机制,还是发布-订阅式的事件发送机制,实际上,都是为了消除软件模块间的耦合。
eventos-basic
EventOS Basic,是一个超级简洁的协作式内核。
它的特点有二:一是协作式,不抢占,按优先级轮询,当前任务不释放CPU控制权,其他任务得不到CPU,二是超级轻量(ROM 968字节,RAM 64字节,-O3)。目前提供出来的功能非常基础,列举如下:
任务创建
任务退出
任务内延时
获取系统时间
这个代码,功能虽然少,但对于任务并发来说,已经完全足够了。由于是协作内核,任务之间不抢占,完全可以十分放心的使用全局变量,进行任务间通信和信息共享。但有一个需要注意的点:用户任务之间不抢占,但是对空闲任务是抢占的,也就是空闲任务是可以被随时中断的。
代码结构
核心代码
核心代码只有两个文件:
eventos/eventos.c EventOS Basic 内核源码
eventos/eventos.h 头文件
例程代码
stm32f030 对ARM Cortex-M0芯片例程。
stm32f103 对ARM Cortex-M3芯片例程。
stm32f429 对ARM Cortex-M3芯片例程。
特性
EventOS Basic 的主要特性:
EventOS Basic在传统的任务机制和 EventOS Nano 的事件机制之间,提供了一个过渡。
协作,不抢占。抢占的内核,FreeRTOS、uC/OS-II、RTX 和 RT-Thread 等,已经做的足够好了。EventOS Basic不重复制造轮子。
事件功能。事件,是 **EventOS **项目的灵魂,是核心,也是 EventOS 的名字与招牌。在 EventOS Basic下,即使有了事件功能,也仅仅是任务间的通信机制,用户自己决定什么时候接收事件。没有事件的驱动,用户代码依然在任务中运行
未来扩展
软定时器
事件队列(非事件驱动、仅用于任务间通信)。
事件桥(与EventOS连接构成分布式应用)
线程锁、信号量,都没有必要在EventOS Basic增加,因为EventOS Basic是协作式,非抢占的内核。邮箱与消息队列等功能,将由事件队列承担。
最后
对于这款新开源的 RTOS 介绍了这么多,难道不想上手试试吗?
目前这个项目还在起步阶段,作者会充分考虑用户提出的意见,对项目进行开发调整。有任何需求可以跟作者交流。
当然,你也可以参与进来,对于提高自己的技术能力大有裨益。
最后,可以加作者微信(Event-OS),与大佬直接对话,交流技术。简直不要太香了~