写点什么

从设计理念解读实时操作系统 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:0610504

评论

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

ARTS 01 - 为什么写作在远程工作中那么重要?

Calvin

ARTS 打卡计划

我的读书生涯-小学到大学: 没有成长, 只有不断加深的疑惑

lmymirror

人生 读书 经历 半虚构

游戏夜读 | 刀塔选手比较老吗?

game1night

回“疫”录(24):开始了就不算晚

小天同学

疫情 个人成长 回忆录 个人感想 日常思考

LeetCode 241. Different Ways to Add Parentheses

liu_liu

LeetCode

ARTS 第一周

Forelax

ARTS 打卡计划

你所不知道的淘宝325秘密

毒手疯波

ios 淘宝 325

Refcard,近300份技术大咖总结的cheat sheet

KAMI

学习 开发 分享 作弊卡

ARTS打卡第一周

落曦

Rust 遇上 C/C++ (一):数组操作

Coding Fatty

c c++ rust 编程语言

手把手透析C语言堆内存申请malloc及扩容realloc

卓丁

c 堆内存管理 heap memory malloc realloc

Mobileye如何在云上进行深度学习模型训练

Randy

自动驾驶 学习 AI AWS

ziliqa生态打造区块链技术实体应用新标杆

极客编

ARTS打卡 week 1

猫吃小怪兽

ARTS 打卡计划

ARTS week 1

刘昱

利用树形结构辅助实现去重算法

卓丁

算法 algorithm tree Deduplication

从 Node 到 Deno

寇云

node.js deno

学会推销自己

一尘观世界

创业 程序员 外包 销售 接项目

职位拆解:互联网-运营

Breeze

行业资讯 移动互联网 运营 AARRR

ARTS打卡第一周

Tom

别在发愁写页面了,强烈推荐几款傻瓜式扒网站神器!!

公众号:V5codings

ARTS 打卡 WEEK1

编程之心

ARTS 打卡计划

绿宝这条宝藏街,夜宵也太太太太太好吃了吧!

极客编

Implement Stack using Queues

Forelax

LeetCode

John 易筋 ARTS打卡Week 01

John(易筋)

ARTS 打卡计划

LeetCode 1048. Longest String Chain

liu_liu

LeetCode

Java 火焰图

wong

Java flamegraph

程序员的晚餐 | 5 月 24 日 咖喱鸡块

清远

美食

人工智能学习心得--人工智能分类

岛乾坤

AI

最优组合问题-贪心算法

公众号:好奇心森林

Linux如何调试内存泄漏

helloworld

c c++ C#

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

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