RT-Thread简介

发布时间:2024年01月07日

RT-Thread简介

RT-Thread是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权。经过16个年头的沉淀,伴随着物联网的兴起,它正演变成一个功能强大、组件丰富的物联网操作系统。

RT-Thread概述

RT-Thread,全称是Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。

事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短,任务与任务之间通过任务调度器进行非常快地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。

在RT-Thread系统中,任务通过线程实现的,RT-Thread中的线程调度器也就是以上提到的任务调度器。

RT-Thread主要采用C语言编写浅显易懂方便移植
它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。

  • 针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要3KB Flash、1.2KB RAM内存资源的NANO版本。
  • 对于资源丰富的物联网设备,RT-Thread又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地导入丰富的软件功能包,实现类似Android的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。

相较于Linux操作系统,RT-Thread体积小,成本低,功耗低,启动快速,除此以外RT-Thread还具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。
虽然32位MCU是它的主要运行平台,实际上很多带有MMU、基于ARM9、ARM11甚至Cortex-A系列基本CPU的应用处理器在特定应用场合也适合使用RT-Thread。

许可协议

RT-Thread系统完全开源,遵循Apache License 2.0开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码,没有潜在商业风险。

RT-Thread的架构

近年来,物联网(Internet Of Things,IoT)概念广为普及,物联网市场发展迅猛,嵌入式设备的联网已是大势所趋。

终端联网使得软件复杂性大幅增加,传统的RTOS内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统(IoT OS)的概念应运而生。

物联网操作系统是指以操作系统内核为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台。

RT-Thread就是一个IoT OS。

RT-Thread与其他很多RTOS如FreeRTOS、uC/OS的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间件组件

在这里插入图片描述
它具体包括以下部分:

  • 内核层:RT-Thread内核,是RT-Thread的核心部分,包括了内核系统中对象的实现,例如多线程及其调度,信号量,邮箱,消息队列,内存管理,定时器等。libcpu/BSP(芯片移植相关文件/板级支持包)与硬件密切相关,由外设驱动和CPU移植构成。
  • 组件与服务层:组件是基于RT-Thread内核之上的上层软件,例如虚拟文件系统、FinSH命令行、网络框架、设备框架等。做到组件内部高内聚,组件之间低耦合。
  • RT-Thread软件包:运行于RTT物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。

RT-Thread提供了开放的软件包平台,这里存放了官方提供或者开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择。

软件包生态对于一个操作系统的选择至关重要,因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内,打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到 400+,如下举例:
物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。
脚本语言相关的软件包:目前支持 Lua、JerryScript、MicroPython、PikaScript。
多媒体相关的软件包:Openmv、mupdf。
工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。
系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。
外设库与驱动类软件包:RealTek RTL8710BN SDK。
其他。

Keil模拟器STM32F103上手指南

一般嵌入式操作系统因为它的特殊性,往往和硬件平台密切相关连,具体的嵌入式操作系统往往只能在特定的硬件上运行。
对于刚接触RT-Thread操作系统的读者并不容易马上就获得一个和RT-Thread操作系统相配套的硬件模块,但随着计算机技术的发展,我们可以采用软件方式来模拟一个能够运行RT-Thread操作系统的硬件模块,这就是ARM公司的MDK-ARM仿真模拟环境。

MDK-ARM(MDK-ARM Microcontroller Development Kit)是一套完整的集成开发环境(IDE),它出自 ARM 公司,包括了针对 ARM 芯片(ARM7,ARM9,Cortex-M 系列,Cortex-R 系列等)的高效 C/C++ 编译器;针对各类 ARM 设备、评估板的工程向导,工程管理;用于软件模拟运行硬件平台的模拟器;以及与市面上常见的如 ST-Link,JLink 等在线仿真器相连接以配合调试目标板的调试器。MDK-ARM 软件中的软件仿真模拟器,采用完全软件模拟方式解释执行 ARM 的机器指令,并实现外围的一些外设逻辑,从而构成一套完整的虚拟硬件环境,使得用户能够不借助真实的硬件平台就能够在电脑上执行相应的目标程序。

MDK-ARM集成开发环境因为其完全的STM32F103软件仿真环境,也让我们有机会在不使用真实硬件环境的情况下直接在电脑上运行目标代码。

这套软件仿真模拟器能够完整地虚拟出 ARM Cortex-M3 的各种运行模式、外设,如中断异常,时钟定时器,串口等,这几乎和真实的硬件环境完全一致。实践也证明,本文使用到的这份 RT-Thread 入门例程,在编译成二进制代码后,不仅能够在模拟器上软件模拟运行,也能够不需要修改地在真实硬件平台上正常运行。

MDK-ARM正式版是收费的,如果希望能够编译出更大体积的二进制文件,需要购买正式版。
RTT也支持自由软件基金会的GNU GCC编译器,这是一款开源的编译器。

初始RT-Thread

在这里插入图片描述

  • applications:应用程序

rt-thread:源文件

  • conponents:组件目录
  • include:内核头文件
  • libcpu:各类芯片的移植代码,此处包含了STM32的移植文件
  • src:内核源文件

系统启动代码

一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。

以 MDK-ARM 为例,MDK-ARM 的用户程序入口为 main() 函数,位于 main.c 文件中。

系统启动后先从汇编代码startup_stm32f103xe.s开始运行,然后跳转到C代码,进行系统功能初始化,最后进入用户程序入口main()。

在conponents.c里定义的代码:

int $Sub$$main(void)
{
	rt_hw_interrupt_disable();
	rtthread_startup();
	return 0;
}

RTT支持多种平台和多种编译器,rtthread_startup()函数是规定的统一入口点。

int rtthread_startup(void)
{
    rt_hw_interrupt_disable();

    /* board level initalization
     * NOTE: please initialize heap inside board initialization.
     */
    rt_hw_board_init();

    /* show RT-Thread version */
    rt_show_version();

    /* timer system initialization */
    rt_system_timer_init();

    /* scheduler system initialization */
    rt_system_scheduler_init();

#ifdef RT_USING_SIGNALS
    /* signal system initialization */
    rt_system_signal_init();
#endif

    /* create init_thread */
    rt_application_init();

    /* timer thread initialization */
    rt_system_timer_thread_init();

    /* idle thread initialization */
    rt_thread_idle_init();

    /* start scheduler */
    rt_system_scheduler_start();

    /* never reach here */
    return 0;
}

这部分启动代码,大致可以分为四个部分:

  • 初始化与系统相关的硬件
  • 初始化系统内核对象,例如定时器,调度器
  • 初始化系统设备,这个主要是为RT-Thread的设备框架做的初始化
  • 初始化各个应用线程,并启动调度器

用户入口代码

上面的启动代码基本上可以说都是和RT-Thread系统相关的,但main函数作为了用户代码入口,只需要在main函数里添加自己的代码即可。

为了在进入main程序之前,完成系统功能初始化,可以使用 s u b sub sub 和 和 super$$函数标识符在进入主程序之前调用另外一个例程,这样可以让用户不用去管main()之前的系统初始化操作。

文章来源:https://blog.csdn.net/Caramel_biscuit/article/details/135435972
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。