1.1 RT-Thread概述
RT-Thread(Real Time-Thread)是一个嵌入式实时多线程操作系统。它的基本属性之一是支持多任务,而允许多个任务同时运行并不意味着处理器在同一时刻真的执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次处理器对一个任务的执行时间很短,任务与任务之间通过任务调度器进行非常快速的切换(调度器根据优先级决定此刻该执行的任务),因此给人造成一种多个任务在同一时刻同时运行的错觉。在RT-Thread系统中,任务是通过线程实现的,RT-Thread中的线程调度器就是以上提到的任务调度器。
RT-Thread主要采用C语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅,架构清晰,系统模块化,且可裁剪性非常好。RT-Thread目前有3个版本:完整版、Nano版以及Smart版。针对资源受限的MCU(微控制器)系统,可通过方便易用的工具裁剪出仅需要3KB Flash、1.2KB RAM内存资源的Nano版。资源丰富的物联网设备可使用RT-Thread完整版。RT-Thread完整版通过在线的软件包管理工具、系统配置工具,可实现直观、快速的模块化裁剪,无缝地导入丰富的软件功能包,实现类似Android的图形界面以及触摸滑动效果,还具有智能语音交互等复杂功能。带有MMU,且基于ARM9、ARM11甚至Cortex-A系列CPU的应用处理器,可以使用Smart版本。该版本可以在RT-Thread操作系统的基础上启用独立、完整的进程,同时以混合微内核模式去执行。
相较于Linux操作系统,RT-Thread体积小,成本低,功耗低,启动快。除此以外,RT-Thread还具有实时性高、占用资源少等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。
1.许可协议
RT-Thread系统完全开源,遵循Apache License 2.0开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码。
2.架构
近年来,物联网(Internet of Things, IoT)概念广为普及,物联网市场发展迅猛,嵌入式设备的联网已是大势所趋。终端联网使得软件复杂性大幅增加,传统的RTOS内核已经越来越难以满足市场的需求。在这种情况下,物联网操作系统(IoT OS)的概念应运而生。物联网操作系统是指以操作系统内核(可以是RTOS、Linux等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全特性,支持通信协议和云端连接能力的软件平台,RT-Thread就是一个物联网操作系统。
RT-Thread与其他很多RTOS(如FreeRTOS、uC/OS)的主要区别之一是,它不仅有实时内核,还具备丰富的中间层组件,如图1-1所示。
图1-1 RT-Thread架构
RT-Thread架构具体包括以下部分。
1)硬实时内核层:RT-Thread内核,这是RT-Thread的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等。另外内核层还包括libcpu/BSP(芯片移植相关文件/板级支持包),它与硬件密切相关,由外设驱动和CPU移植文件构成。
2)组件与服务层:组件是基于RT-Thread内核之上的上层软件,例如虚拟文件系统、FinSH命令行界面、网络框架、设备框架等。采用模块化设计,能够做到组件内部高内聚,组件之间低耦合。
3)软件包层:运行于RT-Thread物联网操作系统平台上,是面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。RT-Thread提供了开放的软件包平台。平台上存放了官方提供或开发者提供的软件包,为开发者提供了众多可重用软件包,是RT-Thread生态的重要组成部分。这些软件包具有很强的可重用性,模块化程度很高,可让应用开发者在最短时间内打造出自己想要的系统。
RT-Thread支持的软件包数量已经达到400多个,举例如下。
1)物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal等。
2)脚本语言相关的软件包:目前支持JerryScript、MicroPython、Lua、PikaScript。
3)多媒体相关的软件包:LVGL、Openmv、mupdf、STemWin、TinyJPEG等。
4)工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。
5)系统相关的软件包:FlashDB、littlefs、MCUboot、lwext4、partition、SQLite等。
6)外设库与驱动类软件包:各类传感器、rosserial、Nordic nRF5_SDK等。
7)嵌入式AI软件包:ONNX、TensorFlow Lite、μLAPack、libann、NNoM等。
3.RT-Thread源码获取
RT-Thread源码获取有几种途径。
❏GitHub: https://github.com/RT-Thread/rt-thread。
❏Gitee: https://gitee.com/rtthread/rt-thread。
另外,读者还可通过RT-Thread Studio创建RT-Thread工程,通过IDE下载源码并将其加入工程中。
4.芯片对接RT-Thread流程
当有一款芯片想要对接RT-Thread时,可以根据图1-2中的流程进行对接。
第1步:查看是否是RT-Thread支持的架构,如果是,可以开始BSP移植;如果不是,可参照文档中心的libcpu移植教程进行移植,网址如下:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/porting/porting。
第2步:进行BSP移植需要完成的基本工作如下。
1)初始化CPU内部寄存器,设定RAM工作时序。
2)实现时钟驱动及中断控制器驱动,完善中断管理。
3)实现串口和GPIO驱动。
4)初始化动态内存堆,实现动态堆内存管理。
此时还要注意一种情况,判断是否为STM32系列,若是,则进行STM32 BSP移植。可以参考STM32 BSP制作教程进行移植,教程链接如下:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/make-bsp/stm32-bsp/stm32-bsp。
第3步:驱动移植,即参考本书中的驱动教程完成相应的驱动移植,最后进行驱动验证。
图1-2 芯片对接RT-Thread流程