RT-Thread嵌入式操作系统

一、系统架构

  RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统。
  RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM 内存资源的 NANO 版本(NANO 是 RT-Thread 官方于 2017 年 7 月份发布的一个极简版内核);而对于资源丰富的物联网设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地导入丰富的软件功能包,实现类似 Android 的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。
  近年来,物联网(Internet Of Things,IoT)概念广为普及,物联网市场发展迅猛,嵌入式设备的联网已是大势所趋。终端联网使得软件复杂性大幅增加,传统的 RTOS 内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统(IoT OS)的概念应运而生。物联网操作系统是指以操作系统内核(可以是 RTOS、Linux 等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台,RT-Thread 就是一个 IoT OS。

  RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件,如下图所示。
在这里插入图片描述
它具体包括以下部分:

1、内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP(芯片移植相关文件 / 板级支持包)与硬件密切相关,由外设驱动和 CPU 移植构成。
2、组件与服务层:组件是基于 RT-Thread 内核之上的上层软件,例如虚拟文件系统、FinSH 命令行界面、网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合。
3、RT-Thread 软件包:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。RT-Thread 提供了开放的软件包平台,这里存放了官方提供或开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择,这也是 RT-Thread 生态的重要组成部分。软件包生态对于一个操作系统的选择至关重要,因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内,打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到 60+,如下举例:

 <1>物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。

 <2>脚本语言相关的软件包:目前支持 JerryScript、MicroPython。
多媒体相关的软件包:Openmv、mupdf。
 <3>工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。
 <4>系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。
 <5>外设库与驱动类软件包:RealTek RTL8710BN SDK。
其他。

二、文件结构

1、RT-Thread 完整版

在这里插入图片描述
该版本适用于需要使用RT-Thread的丰富功能,如各类外设、物联网组件、软件包等的场景。

2、RT-Thread Nano版

在这里插入图片描述
适用于系统资源紧张或是项目功能较为简单,仅需使用RTOS内核,无需丰富功能的场景,且开发时无需额外的辅助工具。

3 源文件的文件说明

1、applications		RT-Thread 应用程序。

2、rt-thread		RT-Thread 的源文件。
	- components		RT-Thread 的各个组件目录。
	- include			RT-Thread 内核的头文件。
	- libcpu			各类芯片的移植代码,此处包含了 STM32 的移植文件。
	- src				RT-Thread 内核的源文件。
	- tools				RT-Thread 命令构建工具的脚本文件。
- 
3、drivers			RT-Thread 的驱动,不同平台的底层驱动具体实现。

4、Libraries		STM32 固件库文件。

5、kernel-sample-0.1.0	RT-Thread 的内核例程。

4 移植后的文件层次

在这里插入图片描述

Applications	它用于存放用户应用代码。
Drivers			它用于存放 RT-Thread 底层的驱动代码。
STM32_HAL		它用于存放 STM32 的固件库文件。
kernel-sample	它用于存放 RT-Thread 的内核例程。
Kernel			它用于存放 RT-Thread 内核核心代码。
CORTEX-M3		它用于存放 ARM Cortex-M3 移植代码。
DeviceDrivers	它用于存放 RT-Thread 驱动框架源码。
finsh			它用于存放 RT-Thread 命令行 finsh 命令行组件。

三、系统启动

  一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头,因为 MDK-ARM 的用户程序入口为 main() 函数,所以先看看 main() 函数在哪个文件中。这里的 main() 函数位于 Startup 组的 startup.c 文件中,它位于 STM32 的启动汇编代码后,与 C 代码的入口跳转前。启动汇编在 STM32_HAL 组的 startup_stm32f103xe.s 中。

下面我们来看看 main() 函数中的这段代码:

 
//components.c 中定义
/* re-define main function */
int $Sub$$main(void)
{
    rt_hw_interrupt_disable();
    rtthread_startup();
    return 0;
}

  在这里 $Sub$$main 函数仅仅调用了 rtthread_startup() 函数。RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一入口点,所以 $Sub$$main 函数只需调用 rtthread_startup() 函数即可。例如采用 GNU GCC 编译器编译的 RT-Thread,就是直接从汇编启动代码部分跳转到 rtthread_startup() 函数中,并开始第一个 C 代码的执行的。在 components.c 的代码中找到 rtthread_startup() 函数,我们将可以看到 RT-Thread 的启动流程:

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;
}
#endif

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

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

四、用户代码

  上面的启动代码基本上可以说都是和 RT-Thread 系统相关的,那么用户如何加入自己的应用程序的初始化代码呢?RT-Thread 将 main 函数作为了用户代码入口,只需要在 main 函数里添加自己的代码即可。

int main(void)
{
  /* user app entry */
  return 0;
}

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

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: rt-thread 是一款面向嵌入式系统的实时操作系统,它具有小巧、灵活、可裁剪等特点,适用于各种嵌入式开发平台和应用领域。rt-thread 的中文指导手册旨在为开发者提供详细的技术指导和使用说明,使其能够更好地理解和使用 rt-thread 操作系统rt-thread 中文指导手册包含了操作系统的架构、底层驱动、线程管理、内存管理、IPC机制、网络协议栈等重要内容,并提供了实际的例子和应用场景,方便开发者学习和使用。此外,rt-thread 中文指导手册还介绍了开源社区、开发工具和常用硬件平台等相关资源,帮助开发者更好地融入 rt-thread 社区,参与到操作系统的开发和改进中来。 rt-thread 中文指导手册将不断更新和完善,以适应不断变化的市场需求和技术发展。同时,rt-thread 开发团队也将持续提供技术支持和社区建设,与开发者一同推动 rt-thread嵌入式领域的发展。 ### 回答2: RT-Thread是一款轻量级、可裁剪的嵌入式实时操作系统,具有可移植性好、资源占用少等优点。RT-Thread操作系统中文指导手册是RT-Thread官方提供的中文文档,包含了系统架构、内核核心、应用框架、驱动开发、网络协议栈等内容。 该指导手册详细介绍了RT-Thread操作系统的设计思路和实现原理,包含了丰富的示例代码、实现细节和使用技巧,方便嵌入式系统开发人员快速上手。 在使用RT-Thread操作系统过程中,可通过该指导手册了解系统的整体结构和各个模块的功能,学习如何进行系统移植、系统配置、内核裁剪、任务调度等相关操作。同时,在应用开发中,可通过该指导手册了解RT-Thread提供的应用框架和API接口,以及常见的驱动开发方法和网络协议栈实现。 RT-Thread操作系统中文指导手册具有简单明了的语言风格和结构布局清晰的特点,易于理解和查阅。对于RT-Thread操作系统的学习和使用具有很高的参考价值,是RT-Thread软件开发者必备的技术文档之一。 ### 回答3: rt-thread是一个轻量级的嵌入式操作系统,适用于各种嵌入式设备的开发。rt-thread操作系统具有很好的可移植性和可扩展性,可以在不同的硬件平台和应用场景下进行应用开发。rt-thread 支持多任务、实时性、轻量级等特点,在工控、智能家居、智能穿戴和智能车载等领域的应用广泛。 rt-thread的中文指导手册很详细,对该操作系统的基本概念、架构、应用开发以及常用驱动等方面进行了全面的介绍。手册首先介绍了rt-thread的特点和优势,包括多任务实时、可扩展性、易移植等,然后介绍了rt-thread的架构和内核对象,包括线程、信号量、消息队列、邮箱等,分别针对这些对象的常用使用方法做了详细的说明和演示。 在应用开发方面,手册对不同的应用场景进行了介绍,例如网络应用、文件系统应用、用户界面应用等,同时也深入讲解了rt-thread的构建和配置、线程同步、中断处理等实践内容。在驱动方面,手册详细阐述了如何使用rt-thread的设备驱动模型来快速开发应用,为开发人员提供了一个较为清晰的开发框架。 总的来说,rt-thread操作系统中文指导手册非常适合初学者学习和开发人员参考,其中浅显易懂的语言和丰富的实例代码都为用户提供了一个高效的编程工具。无论是嵌入式设备的开发还是通用嵌入式应用开发,在rt-thread指导手册的帮助下都能够更方便、更快捷地完成应用开发和维护工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值