一款让人耳目一新的事件驱动型RTOS

b0f93305229f78919370f522d5f73b0b.png

最近有幸接触到了一款新的开源 RTOS 项目,这个项目与传统的 RTOS 不太一样,它是以事件驱动为核心的 RTOS。因此,这个项目的名字为 EventOS。不同于传统的 RTOS 以时钟节拍为驱动核心。

在发布不足一个月的时间,就晋级为 Gitee 推荐项目,目前获得了 216 stars。未来可期~

项目地址:

https://gitee.com/event-os

3c4a71fe7c78d29442e9971e77d1ee76.png


怎样才能做出这个项目

作者大佬的原话:

说实话,是兴趣爱好,再加几十万行代码的磨练。还要主导架构过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 引入了多个概念,比如面向对象、事件驱动、控制反转等等。不要怕新概念,多方面充实自己。

2cd0dcd89db78241042d73379aeb1579.pngbd0fa6c30adf125c45a3805f4728b0dc.png

代码结构

核心代码

核心代码非常简洁,就三个文件:

  • 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)。目前提供出来的功能非常基础,列举如下:

  • 任务创建

  • 任务退出

  • 任务内延时

  • 获取系统时间

这个代码,功能虽然少,但对于任务并发来说,已经完全足够了。由于是协作内核,任务之间不抢占,完全可以十分放心的使用全局变量,进行任务间通信和信息共享。但有一个需要注意的点:用户任务之间不抢占,但是对空闲任务是抢占的,也就是空闲任务是可以被随时中断的。

3decc0ea18eef6670cf299258eb7a87a.png

代码结构

核心代码

核心代码只有两个文件:

  • 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),与大佬直接对话,交流技术。简直不要太香了~

fa2a530a7c197153f058bb2e861aa7a5.jpeg

e06f9344aeab5af51eda41fc81815e9e.jpeg

猜你喜欢

转载自blog.csdn.net/weiqifa0/article/details/129807122