Hello,大家好,我是 RT-Thread 宣传委员(自封的)
我经常给大家安利 RT-Thread,尤其是那些还没用上 RT-Thread、在纠结选择哪个 RTOS、要不要学习 RTOS 的朋友。
1. RT-Thread 简介
1.1 RT-Thread 是什么
据不完全统计,世界有成千上万个 RTOS(Real-time operating system,实时操作系统),RT-Thread 就是其中一个优秀的作品。
RT-Thread 内核的第一个版本是熊谱翔先生在 2006 年年初发布的 0.1 版本。因为 RTOS 中的任务更类似于通用操作系统中的线程,并且这个系统支持基于优先级的抢占式任务调度算法,调度器的时间复杂度是 O(1),所以把它命名为 RT-Thread,即实时线程。名字起得真妙 (。・∀・)ノ
经过14年的发展,RT-Thread 被广泛应用于智能家居、智慧城市、安防、工控、穿戴等众多行业领域,累计装机量超过6亿台,GitHub 的 Star 数量超过 5.3k,嵌入式开源社区活跃度行业第一。
1.2 RT-Thread 的作用
随着 MCU 硬件性能的提升、外设的增加以及软件功能需求的增加,越来越多项目采用 RTOS 的开发方式。一方面裸机开发方式的软件框架不清晰,对后续扩展功能极其不利;另一方面,由于软件复杂性的增加,裸机开发对工程师的要求越来越严苛,过多使用中断等因素,都会增加系统的不可靠性。
和其他优秀的 RTOS 一样,RT-Thread 的首要目标也是解决这些问题。RT-Thread 内核的主要功能是向下管理所有硬件资源,向上为应用程序提供 API 接口和软件服务,所有任务在内核的管理、同步和调度下有序运行。
简单来说,使用 RT-Thread 能够带来如下好处:
- 支持任务并发处理
- 容易扩展新的功能
- 破解应用的复杂性
- 增强代码可移植性
- 节省软件开发时间
- …
您可能会说,其他 RTOS 也能提供这些好处呀,为什么你要推荐 RT-Thread?
因为 RT-Thread 还有许多优点,包括它支持非常多的硬件平台,还拥有及其丰富的组件和软件包(包括文件系统、网络、IoT、AI、传感器等等),提供了便捷的开发环境和 IDE 工具,以及有众多技术文档、参考设计和活跃的开发者社区,这些都能帮助您快速入门和掌握 RT-Thread,开发出优秀的产品。
当然啦,最重要的是,RT-Thread 是一群扎实做事的中国人写的开源操作系统,帮助您做出好产品的同时还能提高民族自信和国家竞争力。
1.3 RT-Thread 的特点
相比其他操作系统,RT-Thread 的主打特性是 “小而美的物联网操作系统”。
“小” 体现在 RT-Thread 的体积小,最小资源占用 1.2KB RAM 和 2.5KB flash。RT-Thread 可伸缩、易裁剪的特性,帮助用户在需要一个适用的操作系统的时候,轻松地进行裁减,适应到需要的场景,不占用过多的资源。
“美” 不单止代码质量和代码风格,还有 RT-Thread 的使用和开发体验,以及增加了小程序、SMP 多核调度、PSA 安全支持等多项实用的新功能,使得 RT-Thread 系统能实现灵活极简的应用开发,能扩展至众多高性能、高安全的应用领域。
“物联网” 则体现在 RT-Thread 针对物联网场景提供的众多组件和软件包,比如 AT组件、WiFi、蓝牙、LoRa、Sensor、AI 等等。以及针对安全和低功耗的优化,还有以 JS 为开发方式的柿饼 UI,都使其非常适用于 IoT 领域。
1.4 开源的 RT-Thread
您可能会担忧,RT-Thread 作为一个开源的操作系统,会不会污染企业私有代码?开发过程中会不会有很多坑?
其实不用担心,因为 RT-Thread 是一个“开源、社区化、中立”的系统。遵循 Apache 2.0 开源许可协议,意味着您可以放心地免费在商业产品中使用 RT-Thread 内核和组件,不需要公开私有代码,只需要在产品说明书上提及“基于 RT-Thread 系统”或“Powered by RT-Thread”即可。
Tips:因为 RT-Thread 软件包平台是开放的,许多软件包都是来自社区开发者,不同软件包的许可协议可能会不一样,所以在商业产品中使用时需要稍加注意。
同时,RT-Thread 非常注重在嵌入式开源社区的生态建设。经过多年的积累,除了有官方技术支持团队,还有活跃的开源社区和数十万开发者,开发过程中的遇到难题都能寻找官方团队和社区开发者的支持。
2. RT-Thread 版本
RT-Thread 针对不同应用场景,目前提供了三个主版本,分别是 RT-Thread 标准版、RT-Thread Nano 和 RT-Thread Smart。
代码均可在 https://www.rt-thread.org/page/download.html 页面下载。
2.1 RT-Thread 标准版
最常用应该是 RT-Thread 标准版(也称为 RT-Thread 全功能版本),它由内核层、组件和服务层、IoT 框架层、文件系统、图形库、设备框架等组成。包含完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力,是一个完整的 IoT OS。
可以看到,除了实时内核,RT-Thread 标准版还具备丰富的中间层组件和软件包生态,这也是 RT-Thread 与其他很多 RTOS 的主要区别之一。
2.2 RT-Thread Nano
RT-Thread Nano 是一个极简的硬实时内核,其内存资源占用极小,功能包括任务管理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。对于系统资源紧张或是项目功能较为简单的,则可以选择基于 RT-Thread Nano 进行开发。比如家电、消费、医疗、工控领域的 32 位入门级 MCU。
Tips:RT-Thread Nano 已得到 ARM Keil 官方的认可和支持,在 Keil MDK 中以 pack 方式提供,方便用户使用。
2.3 RT-Thread Smart
RT-Thread Smart 是一款高性能混合微内核操作系统。其定位在于填补传统 RTOS 和大型操作系统 Linux 之间的空白,在实时性、成本、安全性、启动速度等方面取得最佳的平衡。适用于带 MMU 的中高端应用的芯片,例如 ARM Cortex-A 系列芯片、MIPS 芯片、带 MMU 的 RISC-V 芯片等。广泛应用于安防、车载、军工、消费电子等领域。
RT-Thread Smart 在 RT-Thread 标准版的基础上启用独立、完整的进程方式,同时以混合微内核模式执行。这里“混合”的意思是指在编译时决定整体系统采用什么样的运行模式。
2.4 更多
除了以上三个主版本,RT-Thread 还有不同的演进版本,包括前几天开发者大会发布的专用于智能穿戴领域的 PersimUI OS(湃心OS),以及应用于智能表计领域的 MoM(Microkernel on MCU),还有一些许可授权的衍生OS。
3. RT-Thread 设计思想
RT-Thread 有许多巧妙的设计思想,篇幅有限,这里先介绍几个,其他留给您慢慢探索。
3.1 任务调度
RT-Thread 支持多任务,允许多个任务同时运行,但并不是真正的同时运行(对于单核的 MCU),而是宏观上的并行,这就需要线程调度器(任务调度器)来完成任务的调度了。
RT-Thread 最大支持 256 级优先级(0~255),数值越小优先级越高。可以根据实际情况选择 8 或 32 级,对于 ARM Cortex-M 系列,通常采用 32 级优先级。
调度器是操作系统的核心,其主要功能就是实现线程的切换。RT-Thread 通过管理就绪列表,当需要调度时可以直接找出就绪列表中优先级最高的线程,然后执行该线程,时间复杂度为 O(1)。
rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];
highest_priority_thread = rt_list_entry(rt_thread_priority_table[highest_ready_priority].next,
struct rt_thread,
tlist);
同时,RT-Thread 还采用 round-robin 策略确保对具有相同优先级的所有线程进行同等调度。RT-Thread 的每个线程都有时间片参数,如果您希望控制相同优先级的多个线程的单次运行时长,可以分别给它们设置不同的时间片。
3.2 启动流程
RT-Thread 系统的初始化在 main() 函数之前,这意味着您不需要操心 RT-Thread 的初始化操作,可以专心编写应用程序。
RT-Thread 还提供了自动初始化机制,初始化函数只需要在函数定义处通过宏定义的方式进行声明,就会在系统启动过程中自动执行,不需要在应用代码中显示调用,相当优雅。
针对不同层级,RT-Thread 提供了不同的宏接口:
初始化顺序 | 宏接口 | 描述 |
---|---|---|
1 | INIT_BOARD_EXPORT(fn) |
非常早期的初始化,此时调度器还未启动 |
2 | INIT_PREV_EXPORT(fn) |
主要是用于纯软件的初始化、没有太多依赖的函数 |
3 | INIT_DEVICE_EXPORT(fn) |
外设驱动初始化相关,比如网卡设备 |
4 | INIT_COMPONENT_EXPORT(fn) |
组件初始化,比如文件系统或者 LWIP |
5 | INIT_ENV_EXPORT(fn) |
系统环境初始化,比如挂载文件系统 |
6 | INIT_APP_EXPORT(fn) |
应用初始化,比如 GUI 应用 |
3.3 内核对象
RT-Thread 内核采用面向对象的设计思想进行设计,系统级的基础设施都是内核对象,比如线程、信号量、互斥量、事件、邮箱、消息队列、定时器、内存池、设备驱动等等。然后通过内核对象管理系统来访问/管理所有内核对象,例如当您创建一个对象时,内核对象管理系统就会将这个对象放到一个叫对象容器的地方。
这样做是为了方便管理内核资源,在后续的开发调试阶段可以很方便地获取各个内核对象的状态,并通过 FinSH 输出调试信息。
3.4 FinSH 控制台
FinSH 是 RT-Thread 最早的组件之一,提供了一套类似于 Linux Shell 的操作接口,您可以通过 串口/以太网/USB 等方式与 PC 机进行通信,通过命令行查看系统信息或用于调试。
RT-Thread 默认内置了一些 FinSH 命令,比如 list_thread
和 ps
用于查看线程信息,list_sem
用于查看系统信号量信息,free
用于查看系统内存使用情况等等。如果开启 DFS 组件,还可以使用 ls
、cd
、cp
等命令操作文件系统。
4. RT-Thread 快速上手
为了提升开发体验,RT-Thread 为我们提供了几种开发环境,主要包括使用多年的 Env 工具和近年来主推的 RT-Thread Studio 集成开发环境。
4.1 Env 工具
Env 是 RT-Thread 推出的开发辅助工具,针对基于 RT-Thread 操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的 menuconfig 提供了简单易用的配置剪裁工具,可对内核、组件和软件包进行自由裁剪,使系统以搭积木的方式进行构建。
- 优点:支持 Windows/Linux/MacOS 平台,配置、运行速度快。
- 缺点:学习周期较长,需要了解 git、scons、Kconfig、Python 等知识,需要配合其他工具进行编辑和调试。
- 下载:https://www.rt-thread.org/page/download.html
- GitHub:https://github.com/RT-Thread/env
4.2 RT-Thread Studio
RT-Thread Studio 是一个基于 Eclipse 的开发工具软件,主要包括工程创建和管理,代码编辑,SDK管理,RT-Thread配置,构建配置,调试配置,程序下载和调试等功能。
- 优点:低门槛快速上手,一站式开发,图形化配置,社区版本永久免费。
- 缺点:目前只支持 Windows 平台,配置、编译、运行速度较慢,支持的硬件平台较少。
- 下载:https://www.rt-thread.org/page/studio.html
4.3 其他
还有其他一些开发方式,比如在 Keil MDK 中以 pack 形式添加 RT-Thread 内核。
5. 如何参与社区贡献
最后,如果您也想参与社区建设,为 RT-Thread 的生态贡献一份力量,那么您可以结合自身情况选择轻度参与或重度参与。
5.1 轻度参与
- 在公司产品、个人项目或比赛中使用 RT-Thread;
- 在 RT-Thread 社区 中提问或回答问题;
- 在 GitHub 给 RT-Thread 提 Issue 反馈 Bug;
- 参与社区活动和 B站 直播;
- …
5.2 重度参与
- 在 GitHub 给 RT-Thread 提 PR 修复 Bug 或增加新功能;
- 制作软件包并提交到 官方软件包索引仓库;
- 领取 任务 并加入 社区工作小组;
- 组建社区兴趣小组一起学习;
- 在当地组织或参与开发者沙龙;
- 参与 RT-Thread 开发者能力认证考试;
- …
还有,别忘了参加 RT-Thread 年度开发者大会!
6. 有哪些学习资料
- RT-Thread 文档中心
- RT-Thread 视频中心
- RT-Thread 参考设计中心
- RT-Thread 应用项目汇总
- RT-Thread 编程手册
- ART-Pi 资源网站