草庐IT

【EventOS Nano】EventOS Nano初步了解

-zx- 2023-03-28 原文

EventOS Nano是什么?

EventOS Nano是一个面向单片机、事件驱动的、分布式的、可跨平台开发的嵌入式开发平台。主要有两大技术特色:事件驱动超轻量


EventOS主要特性如下:

  • 事件总线为核心组件,灵活易用,是进行线程(状态机)间同步或者通信的主要手段,也是对EventOS分布式特性和跨平台开发进行支持的唯一手段。事件支持广播发送,或者发布-订阅机制两种方式(二选一)
  • 全局事件队列,摒弃每个线程拥有自己的事件队列的方式,只有一个全局事件队列,极限对压缩对RAM的占用
  • 协作式内核,优点是不会产生资源竞争,非常可靠。
  • 功能强大的软件定时器,以时间事件的形式对软定时器功能,进行功能强大的实现
  • 极度轻量,便于嵌入其他系统,除事件总线外的所有特性(层次状态机,平面状态机,发布-订阅机制,事件桥等)均可裁剪,资源可低至ROM1.2Kb,RAM 172Byte,可以作为子系统,嵌入到其他软件系统中去
  • 未来会使用Event Bridge(事件桥)机制与EventOS打通事件总线,以便对EventOS的分布式特性进行支持。
  • 重点关注三种应用场景:中小资源单片机,作为模块向其他软件系统的嵌入和可靠性要求较高的嵌入式场景。

如何理解事件?

嵌入式系统中,一切发生或者已发生的事情,只要导致了内部数据的变化,都可以被认为是事件

比如,按键的按下或者抬起,串口接收到一组数据,CAN总线接收到一个报文,某个通信协议连接失败,定时500ms时间到,电池电量将到某个阈值之下,温度传感器高于某个阈值,避障传感器检测到障碍物,等等,都可以认为是事件。

是对系统中所发生的事,进行的高级抽象

运用事件机制,可以有效地对RTOS中存在的多种IPC(线程间通信)方式,进行整合。


EventOS Nano主张的编程思想

1.事件驱动与事件总线

EventOS Nano的核心是事件驱动和事件总线,事件机制与RTOS中的事件概念不同,它更像是windows编程中的消息。事件,可以认为是主题+不定长数据,通过事件,可以极大的解耦模块间的耦合,增强软件的可测试性,还可以进行跨平台和分布式开发

2.防御式编程

EventOS Nano使用了大量的断言,对系统的运行过程和用户对EventOS Nano使用大量的检查。在实际的产品代码中,依然打开断言。这样软件将非常快速的收敛于稳定状态

3.跨平台开发

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

4 .消除耦合

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


EventOS Nano的代码结构

1.核心代码

  • eventos/eventos.c EventOS Nano状态机框架的实现
  • eventos/eventos.h 头文件
  • eventos/eventos_config.h 对EventOS Nano进行配置与裁剪

2.三方代码库

  • RTT Segger Jlink所提供的日志库,依赖JLink硬件。
  • unity 单元测试框架

3.例程代码

  • freertos对FreeRTOS的适配例程
  • posix对符合POSIX标准的操作系统(如linux,MinGW等)的适配例程
  • stm32f030对ARM Cortex-M0芯片的裸机运行(无RTOS)的例程
  • stm32f103对ARM Cortex-M3芯片的裸机运行(无RTOS)的例程
  • test对源码进行的单元测试例程
  • digital_watch电子表例程,状态机的典型应用。

4.tools

一些Python脚本和工具







下一步:编译运行EventOS demo,实际跑跑看



参考资源: https://mp.weixin.qq.com/s/0BkOD8hKCRW4OxoOlpIfLw
仓库地址:https://gitee.com/event-os/eventos.git

有关【EventOS Nano】EventOS Nano初步了解的更多相关文章

  1. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  2. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

  3. ruby-on-rails - 了解 "attribute_will_change!"方法 - 2

    我想覆盖store_accessor的getter。可以查到here.代码在这里:#Fileactiverecord/lib/active_record/store.rb,line74defstore_accessor(store_attribute,*keys)keys=keys.flatten_store_accessors_module.module_evaldokeys.eachdo|key|define_method("#{key}=")do|value|write_store_attribute(store_attribute,key,value)enddefine_met

  4. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  5. ruby-on-rails - 正确了解 Rails 框架的最佳方式是什么? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在Rails上做两个项目,它们运行良好,但在这个过程中重新发明了轮子,自来水(和热水)和止痛药,正如我随后了解到的那样,这些已经存在于框架中。那么基本上,正确了解框架中所有智能部分的最佳方法是什么,这将节省时间而不是自己构建已经实现的功能?从第1页开始阅读文档?是否有公开所有内容的特定示例应用程序?一个特定的开源项目?所有的rails交通?还是完全

  6. ruby - 了解 Ruby Enumerable#map(具有更复杂的 block ) - 2

    假设我有一个函数defodd_or_evennifn%2==0return:evenelsereturn:oddendend我有一个简单的可枚举数组simple=[1,2,3,4,5]然后我用我的函数在map中运行它,使用一个do-endblock:simple.mapdo|n|odd_or_even(n)end#=>[:odd,:even,:odd,:even,:odd]如果不首先定义函数,我怎么能做到这一点?例如,#doesnotworksimple.mapdo|n|ifn%2==0return:evenelsereturn:oddendend#Desiredresult:#=>[

  7. ruby - 了解 Ruby 中赋值和逻辑运算符的优先级 - 2

    在以下示例中,我无法理解Ruby运算符的优先级:x=1&&y=2由于&&的优先级高于=,我的理解是类似于+和*运算符:1+2*3+4解析为1+(2*3)+4它应该等于:x=(1&&y)=2但是,所有Ruby源代码(包括内部语法解析器Ripper)都将其解析为x=(1&&(y=2))为什么?编辑[08.01.2016]让我们关注一个子表达式:1&&y=2根据优先规则,我们应该尝试将其解析为:(1&&y)=2这没有意义,因为=需要特定的LHS(变量、常量、[]数组项等)。但是既然(1&&y)是一个正确的表达式,那么解析器应该如何处理呢?我试过咨询Ruby的parse.y,但它太像意大利面条

  8. ruby - 了解 ruby 奎因 - 2

    我在维基百科上找到了这个代码块,作为Ruby中quine(打印自身的程序)的示例。puts但是,我不明白它是如何工作的。特别是,我没有得到的是,当我删除最后一行时,出现此错误:syntaxerror,unexpected$end,expectingtSTRING_CONTENTortSTRING_DBEGortSTRING_DVARortSTRING_END这些行中发生了什么? 最佳答案 语法以here-document开始,通过Perl从UNIXshell借用-它基本上是一个多行字符串文字,从之后的行开始当一行以something

  9. 最近火热的“数字藏品”,你真的了解吗? - 2

    最近火热的“数字藏品”,你真正了解吗?其实有很多人会把数字藏品跟NFT混为一谈,但其实这两者还是有差别的。数字藏品并不等同于NFT数字藏品是什么?直观来看,它可能就是一张数字化照片或视频,甚至就只是一串数字。但它却是一件对应特定作品、艺术品生成的包含着大量数字信息且拥有唯一加密信息的可以买卖交易的收藏品。NFT则是指一种基于以太坊区块链的“非同质化代币”。它在百度百科里的释义是“用于表示数字资产(包括jpg和视频剪辑形式)的唯一加密货币令牌,可以买卖”。比如已被很多人认识的比特币就是NFT的一种。NFT在元宇宙中发挥的作用是巨大的,目前正是它在支撑着元宇宙中的经济体系。数字藏品其实也是NFT的

  10. 你真正了解什么是接口测试么?接口实战一“篇”入魂 - 2

    最近在工作中,看到一些新手测试同学,对接口测试存在很多疑问,甚至包括一些从事软件测试3,5年的同学,在聊到接口时,也是一知半解;今天借着这个机会,对接口测试做个实战教学,顺便总结一下经验,分享给大家。计划拆分成4个模块跟大家做一个分享,(接口测试、接口基础知识、接口自动化、接口进阶)感兴趣的小伙伴记得关注,希望对你的日常工作和求职面试,带来一些帮助。注:文章较长有5000多字,希望小伙伴们认真看完,当然有些内容对小白同学不是太友好,如果你需要详细了解其中的一些概念或者名词,请在文章之后留言,后续我将针对大家的疑问,整理输出一些大家感兴趣的文章。随着开发模式的迭代更新,前后端分离已不是新的概念,

随机推荐