浅浅了解一下 RT-Thread
转载自:http://www.uml.org.cn/embeded/202206174.asp
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。
代码均可在以下页面下载。
下载 - RT-Thread物联网操作系统
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)。
/* ready thread list */ rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]; /* get highest ready priority thread */ 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 提供了不同的宏接口:
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 等知识,需要配合其他工具进行编辑和调试。
下载:
下载 - RT-Thread物联网操作系统
www.rt-thread.org/page/download.html
GitHub:
RT-Thread/env
github.com/RT-Thread/env
4.2 RT-Thread Studio
RT-Thread Studio 是一个基于 Eclipse 的开发工具软件,主要包括工程创建和管理,代码编辑,SDK管理,RT-Thread配置,构建配置,调试配置,程序下载和调试等功能。
优点:低门槛快速上手,一站式开发,图形化配置,社区版本永久免费。
缺点:目前只支持 Windows 平台,配置、编译、运行速度较慢,支持的硬件平台较少。
下载:
RT-Thread Studio
www.rt-thread.org/page/studio.html
4.3 其他
还有其他一些开发方式,比如在 Keil MDK 中以 pack 形式添加 RT-Thread 内核。
5. 有哪些学习资料
RT-Thread 文档中心
学习路线 - RT-Thread 文档中心 www.rt-thread.org/document/site/ |
RT-Thread 视频中心
RT-Thread 视频中心 - RT-Thread物联网操作系统 www.rt-thread.org/page/video.html |
RT-Thread 参考设计中心
RT-Thread 项目设计中心 www.rt-thread.org/page/projects.html |
RT-Thread 应用项目汇总
RT-Thread应用项目汇总 - RT-Thread问答社区 club.rt-thread.org/ask/article/2292.html |
RT-Thread 编程手册
《RT-Thread编程手册》 - 书栈网 · BookStack www.bookstack.cn/books/rtthread-manual-doc |
ART-Pi 资源网站
ART-Pi art-pi.gitee.io/website/ |