从设计理念解读实时操作系统RT-Thread

2017 年 10 月 02 日

RT-Thread 是一个集内核、中间件组件于一体的实时操作系统(RTOS),由熊谱翔先生带领并集合开源社区力量开发而成,具有极小内核、稳定可靠、简单易用、高度可伸缩、组件丰富等特点。

经过 11 年的累积发展,RT-Thread 已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量达数千万台,成为国人自主开发、国内最成熟稳定和装机量最大的开源 RTOS。

当前正值“智慧”与“物联”应用突破导入期,各种广域与局域联网协议进入全面发展新阶段,国产的 MCU 和无线 SoC 厂商也崭露头角,为各种物联网应用提供了强劲的处理与联网能力。

趋势的背后,是面向各种物联网应用的新一代操作系统的迫切需求。顺应趋势,基于我们十年、多领域嵌入式应用迭代出的稳定性与经验,发布了 RT-Thread 3.0,期望能成为构筑物联网技术基石的物联网操作系统。

源自“简单、唯美”的设计理念

2006——0.0.1 版本

诞生于 2006 年的 RT-Thread,最初源于对当时小型 RTOS 现状的诸多不满。最令人印象深刻的是不同 RTOS 混乱的命名风格——如果那个时候有一份类似 Linux/Unix 风格的小型 RTOS,也许就没有现在的 RT-Thread 了。细想起来,正是这一想法成为了 RT-Thread 创作的一个重要契机。

长期浸润于开源社区,我早已经习惯了 Linux/Unix 的风格:编程时几乎都以小写命名、以下划线来连接不同的单词——直到现在,我依然认为只有这样的代码阅读起来才谈得上舒服——相信很多人会有类似的感受吧。

真正开始动手后,RT-Thread 试图遵循更多 Linux/Unix 优雅、明快的风格——从划分清模块开始,一点一点理清模块、梳理命名——力图保持“程序的简洁”和“脉络的清晰”:小到变量、函数,大到源文件、模块无一不遵守统一的风格。

只做一件事情,并把它做好,而不逾越雷池一步——Do one thing and do it well.

这也是人们常说的“简单、唯美”。这逐渐形成了 RT-Thread 的设计理念,RT-Thread 要做一个精致而优雅的操作系统。

从“0.3”到 “2.1.0”

2010.04.17——0.3.0 版本

因为开源理念早就扎根于心,期待同类开发者们更多的分享、交流,所以很早的时候 RT-Thread 就以 社区化、开放方式 推进。从 0.0.1 版本起,RT-Thread 就以每个版本一个软件包的方式进行发布,直到发布 0.3.0 时,Google Code 兴起,下面的框图就是当时放于 Goolge Code 上发布的第一个版本:RT-Thread 0.3.0。后续由于 Google Code 关闭,转而放到 github,持续到现在(国内放在是 OSChina 的码云上)。

https://github.com/RT-Thread/rt-thread

http://git.oschina.net/rtthread/rt-thread

RT-Thread 0.3.0 结构框图

0.3.0 版是基础设施的搭建阶段:内核、文件系统、网络协议栈和命令行环境的雏形在这个时候已初具端倪。

2011.12.31——1.0.0 ~ 1.2.0 版本

紧接着 0.3.0 版的发布,0.4.0 版的开发几乎立即就开始了。当时我们基本保持着一个稳定版本,新特性完全冻结,以 bug 修正为主;另一个版本,以添加新功能,向着下一个方向推进的方式进行。

通过这样的方式可以快速推进、迭代,同时也不失稳定性及后向的兼容性。在 0.4.0 版本经过数个版本迭代,成为正式版之际,我们宣布发布 RT-Thread 1.0.0 正式版本。1.0.0 正式版本也意味着:RT-Thread 不光具备一个嵌入式实时操作系统所必需的全部基本功能,它的稳定性也达到了商用级别。

随着 RT-Thread 支持的芯片和平台越来越多,如何有效组织工程变成了一个非常棘手的问题。大多数做法是使用 Makefile,但对于不同的桌面开发平台,Makefile 表现得并不那么友好(例如 Windows 平台),同时 Makefile 变化多样、晦涩难懂的语义也导致掌握它有一定门槛。

这个时候使用 Python 语言实现的 scons 工具进入到我们的视野中来。从服务开发者角度出发,最终基于 scons 搭建的 RT-Thread 构建系统不仅提供了 Windows、Linux 和 MAC 下统一的用户体验,同时也针对不同集成开发环境(IDE)按照配置情况,生成对应的工程文件,这样开发者可以选择最习惯,最顺手的集成开发环境。

应该说 RT-Thread 1.x 系列已经是一个相对成熟的嵌入式实时操作系统。在一个系统平台上开发代码,另外一个必须要考虑的是软件代码的可维护性。简单松耦合 的设计是软件代码可维护性的一方面,而另一方面是 跨平台 的软件代码可维护性。如果为了实现一样或相类似的功能,针对 Linux、RTOS 分别要维护两个版本,这个工作量几乎要翻倍了!

在最初设计时,针对文件系统、网络协议栈,RT-Thread 都希望用最标准、开放的方式提供 API 服务接口,甚至是 RT-Thread 也支持了完整的 PThreads 接口,使得 POSIX 线程和 RT-Thread 线程得以无缝结合,用户不需要再为他的代码额外维护另外一个版本。

抽象外设驱动,形成简单、独立模块。一份 BSP(Board Support Package 板级支持包) 移植主要的工作是两个方面,芯片架构移植和外设支持。

在 RT-Thread 逐步的演进过程中,发现当更换芯片时,大部分外设驱动有很大一部分代码是一样的。例如针对串口,基本上都会有一份软件上的环形缓冲区(Ring Buffer)。

这个时候把这些公共的部分提取出来,抽象封装形成一份面向设备的驱动,而驱动底层则只需要简单地实现芯片具体相关的操作接口(ops)就可以了。

Device Drivers 组件就是这样逐渐演变出来的,到目前已经包括串口,网口,IIC,SPI,RTC,WDT,Audio,USB 等一系列的抽象设备模型,为方便支持不同的芯片、板卡节省下大量的时间。

2015.02.02——2.0.0 ~ 2.1.0 版本

在嵌入式市场中,实时 Linux 是很早的一支。但因为 Linux 天生架构的问题,要想获得高实时性并没那么容易,或者说 Linux 本身这套架构并不适合高实时性应用。另外市场上多核处理器(SMP 对称处理器或 AMP 异构处理器)也逐渐应用到嵌入式系统领域。

在这个背景下,RT-Thread 也在探索如何让 RT-Thread 成为 Linux 的有益补充。基于 RT-Thread 自身简单、独立的设计考虑,RT-Thread 实现了支持双操作系统协同工作的虚拟总线组件(VBUS),能够让双方进行相互的数据通信,而并不会把一些实时性问题和 Linux 纠缠在一起。

追求更好的设计,重构,甚至 推翻重新设计。随着智能机的普及,用户的操作体验已然不是键盘 / 鼠标式的 PC 风格所能满足,更多的是以轻触,滑动,拖拽,缩放等为代表的触控方式。

与之对应,嵌入式 GUI 技术出现了翻天覆地的变化,而 RT-Thread 原有的以 C 语言模拟面向对象技术进行开发的 rtgui 在代码简洁性、可读性和实用性上也难以满足需求——简单来说,由触控 GUI 带来的面向对象需求,虽然使用 C 语言能够实现,但太过繁琐、复杂,和我们一直以来追求的简洁之美背道而驰。

思考再三,我们决定依照现代化 GUI 风格重写 GUI 组件,以 C++ 为基础,支持多点触摸,提供类似 signal/slot 信号槽的使用方式,包括各种动画特效等……这一支持界面动画效果的全新 GUI,我们称之为 柿饼(Persimmon)。

Persimmon 结构框图

“简单,唯美”,搭建高可伸缩性系统

从 0.3.0 到 2.1.0,都是建立在“简单、唯美”的设计理念基础之上。再配合 scons 构建工具,从而让 RT-Thread 成为一个 高可伸缩 的系统:最小可以到 3KB Flash,1.2KB SRAM 的 nano 系统;也可无缝延伸到功能丰富的,针对 ARM9、ARM11、MIPS32 等处理器,具备现代 GUI 风格,或多媒体功能的全功能版本。

从小型系统到全功能系统

RT-Thread 可以适配小型微控制器(主要保留内核部分,3kB Flash,1.2kB SRAM),到一个携带完整 POSIX 环境,包括复杂 UI,多媒体,物联网等相关功能的微处理器。

IoT,RT-Thread 3.0

回顾以往的版本,设计一套类似 Linux/Unix 优雅风格的轻型、可裁剪系统一直是 RT-Thread 的目标。能够以开源、自由方式在嵌入式系统领域,或者说在 Linux 和 RT-Thread 系统之间自由穿梭,自由翱翔……这种感觉非常美妙。

随着万物互联概念的普及,物联网从最初的概念兴起,逐步走到今天的大规模实现和部署阶段,原有的嵌入式系统不再是孤立的系统,将形成一个有机的、联动的整体。

这个大背景下, RT-Thread 依然沿着自己的理念向着万物互联的 IoT 大步迈进,我们在 RT-Thread 的演进过程中不断融合物联网终端系统的新特征和新需求,发布 RT-Thread 3.0。

针对物联网终端的高度碎片化和低资源占用要求,我们引入专门的配置工具,实现系统的高度可裁剪可定制;基于物联网的多样化通讯和连接方式,我们优化并支持丰富的网络协议和无线连接如 WiFi、NB-IoT 等。

RT-Thread 3.0 全新架构图

它可以支持多种主流架构的 MCU 内核,强调安全性,方便连网,其开放的 API 非常方便物联网产品开发者来做开发

RT-Thread 3.0 IoT OS 具有以下特性:

  • 稳定可靠

10 年技术积累,千万级装机量验证,在工业、新能源、电力、消费、家电、交通等各行业被广泛使用。

  • 简单易用

架构清晰、Unix 内核代码风格、调试方便、多个辅助工具、兼容性更好的 POSIX 接口支持、编译工具支持广泛。

  • 组件丰富

包括虚拟文件系统、设备框架、低功耗管理框架、网络协议栈、TLS/DTLS、图形库、音频流媒体框架、固件远程升级 FOTA 等。

  • 高度可伸缩

通过全新的配置工具和包管理工具,实现系统的易裁剪、易扩展,适用于不同档次的产品,大大增加软件的可复用性和灵活性,提升开发效率。

  • 跨芯片平台

无论选择什么样的微控制器,使用 RT-Thread 接口编程的应用程序都可以高度复用。

作者简介

熊谱翔,2000 年毕业于重庆邮电学院,先后在上海贝尔阿尔卡特、上海宇梦通信、Marvell 从事软件开发、管理工作。

感谢雨多田光对本文的审校。

2017 年 10 月 02 日 19:06 8386

评论

发布
暂无评论
发现更多内容

煌煌中原 化鲲为鹏

脑极体

程序员陪娃系列——小娃的到来

孙苏勇

程序员人生 陪伴 随笔杂谈

F5G的星光闪烁,为工业而明,向未来而歌

脑极体

超英文邮件50%!Flink 中文邮件列表必须有姓名

Apache Flink

flink

贵州:“区块链+”促经济转型产业升级

CECBC区块链专委会

libuv 异步网络编程之 TCP helloworld

Huayra

网络编程 libuv

内存总是不够?HBase&GeoMesa配置优化了解一下

华为云开发者社区

内存模型 内存 HBase 大集群 GeoMesa

趣文:那天我被拉入 C++ 亲友群

程序员生活志

c c++ 程序员趣事

低代码平台会让程序员失业?测评了5个工具,谁能让效率提高N倍?

代码制造者

编程 编程语言 低代码 零代码 测评

MySQL“被动”性能优化汇总!

王磊

MySQL

【漫画】最近,老王又双叒get了CDN的新技能—可编程化敏捷开发

巨侠说

CDN

Linkerd 2.8 - 實現超級簡單又安全的多叢集(multicluster) Kubernetes 架構

Rammus

Kubernetes DevOps 运维 云原生 Service Mesh

使用 supervisor 配置 ngrok 内网穿透为守护进程

jerry.mei

Linux 操作系统 ngrok 守护进程 内网穿透

移卡荣登2020「AI 最佳成长榜」,AI+金融科技赋能商业服务

DT极客

程序员陪娃系列——小小免费按摩师

孙苏勇

程序员人生 陪伴 随笔杂谈

LeetCode题解:21. 合并两个有序链表,递归,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

多角度分析,通讯时序数据的预测与异常检测挑战

华为云开发者社区

时序数据库 即时通讯 异常检测 网络智能体 时序预测

构造、析构期间被调虚函数发生的惨案,长教训!

华为云开发者社区

代码 组合模式 封装、继承、多态 bug 回调函数

学生党学编程,有这个开源项目就够了!

JackTian

GitHub 编程 程序员 学生党 学习资料

入职两周,怀疑自己进了假百度!跟传说中完全不一样!难道真有两家百度公司?

程序员生活志

百度 程序员生活

程序员陪娃系列——见你的第一面

孙苏勇

程序员人生 陪伴 随笔杂谈

程序员陪娃系列——育儿路上二三事续

孙苏勇

程序员人生 陪伴 随笔杂谈

BIGO技术:实时计算平台建设

InfoQ_3597a20b53cc

互联网 BIGO

“云”上教与学,让教育不止步于课堂

Geek_116789

太赞了!程序员应该访问的最佳网站都在这里了!

JackTian

GitHub 编程 程序员 学习资源 网站平台

程序员陪娃系列——育儿路上二三事

孙苏勇

程序员人生 陪伴 随笔杂谈

主权投资基金或有助于实现可持续发展目标

CECBC区块链专委会

联盟链落地与激励机制

CECBC区块链专委会

一款基于 Python 语言的 Linux 资源监视器!

JackTian

Python GitHub Linux bashtop bpytop

程序员陪娃系列——和孩子聊生死

孙苏勇

程序员人生 陪伴 随笔杂谈

数据库外键

will

数据库 性能 外键

从设计理念解读实时操作系统RT-Thread-InfoQ