RT-Thread实时操作系统简介

目录

一、概述

二、架构

三、版本选择

四、内核启动流程

五、自动初始化机制

六、内核对象模型

七、I/O设备模型

1、框架

2、设备驱动使用序列图

3、设备类型

八、FinSH控制台

九、ENV工具

1、menuconfig

2、Scons构建工具

3、软件包管理器(package)

 十、RT-Thread Studio


一、概述

RT-Thread 是一款完全由国内团队开发维护的集实时操作系统(RTOS)内核,文件系统、网络框架、设备框架等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接等能力的物联网操作系统,具有完全的自主知识产权。具有如下特点:

  1. 资源占用极低,超低功耗设计,最小内核(Nano版本)仅需1.2KB RAM,3KB Flash;
  2. 组件丰富,繁荣发展的软件包生态 ;                                
  3. 简单易用 ,优雅的代码风格,易于阅读、掌握;
  4. 高度可伸缩,优质的可伸缩的软件架构,松耦合,模块化,易于裁剪和扩展;
  5. 强大,支持高性能应用;
  6. 跨平台、芯片支持广泛,已经覆盖当前应用中的主流体系架构: ARM Cortex-M0/M0+,  ARM Cortex-M3/M4/7,  ARM Cortex-R4,  ARM Cortex-A8/A9 ARM920T/ARM926 etc,  MIPS32, x86,Andes,C-Sky, RISC-V, PowerPC
  7. 丰富的软件包

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

脚本语言相关的软件包:目前支持 JerryScript、MicroPython。

多媒体相关的软件包:Openmv、mupdf。

工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。

系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。

外设库与驱动类软件包:RealTek RTL8710BN SDK。

二、架构

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

三、版本选择

四、内核启动流程

RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺序是:系统先从启动文件开始运行,然后进入 RT-Thread 的启动 rtthread_startup() ,最后进入用户入口 main()。以MDK-ARM为例,使用了MDK的扩展功能$Sub与$Super,给 main 添加 $Sub$$ 的前缀符号作为一个新功能函数 $Sub$$main,这个 $Sub$$main 可以先调用一些要补充在 main 之前的功能函数(这里添加 RT-Thread 系统启动,进行系统一系列初始化),再调用$Super$$main 转到 main() 函数执行, 这样可以让用户不用去管 main() 之前的 系统初始化操作。 

五、自动初始化机制

自动初始化机制是指初始化函数不需要被显式调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。例如在串口驱动中调用一个宏定义告知系统初始化需要调用的函数,代码如下:

int rt_hw_usart_init(void)  {    
      ... ...
     rt_hw_serial_register(&serial1, "uart1", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,  uart);
     return 0;
}
INIT_BOARD_EXPORT(rt_hw_usart_init);    /* 使用组件自动初始化机制 */

示例代码最后的 INIT_BOARD_EXPORT(rt_hw_usart_init) 表示使用自动初始化功能,按照这种方式,rt_hw_usart_init() 函数就会被系统自动调用。

那么它是在哪里被调用的呢?实现的原理又是什么呢?

在哪里被调用的:

初始化顺序

宏接口

描述

1

INIT_BOARD_EXPORT(fn)

非常早期的初始化,此时调度器还未启动

使用该宏后,fn 将属于 “board init functions”

2

INIT_PREV_EXPORT(fn)

主要是用于纯软件的初始化、没有太多依赖的函数

使用该宏后,fn 将属于 “pre-initialization functions”

3

INIT_DEVICE_EXPORT(fn)

外设驱动初始化相关,比如网卡设备

使用该宏后,fn 将属于 “device init functions”

4

INIT_COMPONENT_EXPORT(fn)

组件初始化,比如文件系统或者 LWIP

使用该宏后,fn 将属于 “components init functions”

5

INIT_ENV_EXPORT(fn)

系统环境初始化,比如挂载文件系统

使用该宏后,fn 将属于 “enviroment init functions”

6

INIT_APP_EXPORT(fn)

应用初始化,比如 GUI 应用

使用该宏后,fn 将属于 “application init functions”

自动初始化原理:

RT-Thread 的自动初始化机制使用了自定义 RTI 符号段,将需要在启动时进行初始化的函数指针使用这些宏定义接口放到了该段中,形成一张初始化函数表,在系统启动过程中会遍历该表,并调用表中的函数,达到自动初始化的目的

六、内核对象模型

RT-Thread 内核采用面向对象的设计思想进行设计,系统级的基础设施都是一种内核对象,例如线程,信号量,互斥量,定时器等。内核对象分为两类:静态内核对象和动态内核对象,静态内核对象通常放在 RW 段和 ZI 段中,在系统启动后在程序中初始化;动态内核对象则是从内存堆中创建的,而后手工做初始化。

 RT-Thread 采用内核对象管理系统来访问 / 管理所有内核对象,内核对象包含了内核中绝大部分设施,这些内核对象可以是静态分配的静态对象,也可以是从系统内存堆中分配的动态对象;对象容器中包含了每类内核对象的信息,包括对象类型,大小等。对象容器给每类内核对象分配了一个链表,所有的内核对象都被链接到该链表上

七、I/O设备模型

1、框架

RT-Thread提供了一套简单的I/O设备模型框架,对不同的I/O设备进行管理;它位于硬件和应用程序之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。这样使得设备的硬件操作与应用程序相互独立,双方只需关心各自的实现,从而降低代码的耦合性、复杂性、提高了系统的稳定性

 应用程序通过 I/O 设备管理接口获得正确的设备驱动,然后通过这个设备驱动与底层 I/O 硬件设备进行数据(或控制)交互

I/O 设备管理层实现了对设备驱动程序的封装,对应用程序提供访问底层设备的标准IO接口

设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现

设备驱动层是一组驱使硬件设备工作的程序,实现访问硬件设备的功能。它负责创建和注册 I/O 设备,对于操作逻辑简单的设备,可以不经过设备驱动框架层,直接将设备注册到 I/O 设备管理器中

2、设备驱动使用序列图

1、直接注册到I/O设备管理器中

  • 设备驱动根据设备模型定义,创建出具备硬件访问能力的设备实例,将该设备通过 rt_device_register() 接口注册到 I/O 设备管理器中。
  • 应用程序通过 rt_device_find() 接口查找到设备,然后使用 I/O 设备管理接口来访问硬件

 2、先注册到设备驱动框架

  • 看门狗设备驱动程序根据看门狗设备模型定义,创建出具备硬件访问能力的看门狗设备实例,并将该看门狗设备通过 rt_hw_watchdog_register() 接口注册到看门狗设备驱动框架中。
  • 看门狗设备驱动框架通过 rt_device_register() 接口将看门狗设备注册到 I/O 设备管理器中。
  • 应用程序通过 rt_device_find() 接口查找到设备,然后使用 I/O 设备管理接口来访问硬件

3、设备类型

RT_Device_Class_Char             /* 字符设备       */
RT_Device_Class_Block            /* 块设备         */
RT_Device_Class_NetIf            /* 网络接口设备    */
RT_Device_Class_MTD              /* 内存设备       */
RT_Device_Class_RTC              /* RTC 设备        */
RT_Device_Class_Sound            /* 声音设备        */
RT_Device_Class_Graphic          /* 图形设备        */
RT_Device_Class_I2CBUS           /* I2C 总线设备     */
RT_Device_Class_USBDevice        /* USB device 设备  */
RT_Device_Class_USBHost          /* USB host 设备   */
RT_Device_Class_SPIBUS           /* SPI 总线设备     */
RT_Device_Class_SPIDevice        /* SPI 设备        */
RT_Device_Class_SDIO             /* SDIO 设备       */
RT_Device_Class_Miscellaneous    /* 杂类设备        */

八、FinSH控制台

FinSH 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口;支持权限验证、自动补全、查看历史命令等功能

 在设备端通常使用串口与PC机进行通讯

 FinSH 支持两种输入模式,分别是传统命令行模式(msh)C 语言解释器模式(C-Style),它们可以切换;两种模式下的命令不通用。C-Style 模式在运行脚本或者程序时不太方便且占用体积较大,推荐使用msh模式

  1. msh 模式下,FinSH 与传统 shell(dos/bash)执行方式一致:command [arg1] [arg2] [...]
  2. C-Style模式下,FinSH输入的命令必须类似 C 语言中的函数调用方式,即必须携带 () 符号,FinSH命令的输出为此函数的返回值。对于一些不存在返回值的函数,这个输出没有意义

 自定义FinSH 命令

类型

命令

描述

自定义msh命令

MSH_CMD_EXPORT(name, desc);

可以导出有参或无参的命令

自定义C-Style命令

FINSH_FUNCTION_EXPORT(name, desc);

导出一个函数

自定义C-Style变量

FINSH_VAR_EXPORT(name, type, desc);

导出一个变量

自定义命令重命名

FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc);

默认导出到C-Style模式;在重命名的命令名字前加 __cmd_ 就可以将命令导出到 msh 模式

九、ENV工具

Env是RT-Thread 推出的开发辅助工具,提供Scons编译构建环境、menuconfig图形化系统配置及基于git的软件包管理功能。ENV带有 SCons 和 Python,在 windows 平台使用 SCons 则不需要安装这两个软件,但需要自行安装 git 并加入环境变量。

1、menuconfig

menuconfig 是一种图形化配置工具,是RT-Thread 3.0 以上版本的特性,可对内核、组件和软件包进行自由裁剪,使系统以搭积木的方式进行构建。执行 menuconfig 命令时是通过读取当前 bsp 目录下的 Kconfig 文件来生成配置界面的,这个文件就是所有配置的总入口,它会包含其他目录的 Kconfig 文件。Kconfig文件中使用Kconfig语法在menuconfig的配置项中添加宏定义

 Kconfig语法:

1、config 语句表示一个配置选项的开始,紧跟着的是配置选项的名称,每个配置项可以有如下属性,表示该配置选项的类型、输入提示、依赖关系、 默认值、帮助信息等

  • 配置选项的类型,bool 、string 、hex 、int 等
  • select 反向依赖关系
  • default 配置选项的默认值

2、menu/endmenu 语句用于生成菜单

3、if/endif 语句是一个条件判断

4、menuconfig 语句表示带菜单的配置项

5、depends on 表示依赖某个配置选项

6、source 语句用于读取另一个文件中的 Kconfig 文件

2、Scons构建工具

SCons 是一套由 Python 语言编写的开源构建系统,类似于 GNU Make,但是它采用不同于 Makefile 文件的方式,而是使用 SConstructSConscript 文件来组织源码结构。SCons 可以根据一定的规则或指令,将源代码编译成可执行的二进制程序,目前支持的编译器包括 ARM GCC、MDK、IAR、VisualStudio、Visual DSP。通常来说一个项目只有一 SConstruct(位于BSP目录下),但是会有多个 SConscript,是组织源码的主力军;一般情况下,每个存放有源代码的子目录下都会放置一个 SConscript文件,这些文件会被 BSP 目录下的 SConscript 文件 “找到” 从而将 rtconfig.h 中定义的宏对应的源代码加入到编译器中来。

Scons常用命令:

scons -c 清理编译目标

scons --target=iar/mdk4/mdk5 编译成目标工程

scons --dist 搭建项目框架,在 BSP 目录下生成 dist 目录,包含了RT-Thread源码及BSP相关工程,不相关的BSP文件夹及libcpu都会被移除,可以拷贝此工程到任何目录下使用。

 Scons用法:

SCons 提供了很多内置函数,利用这些函数,再配合一些简单的 Python 语法 就能向项目中添加或者删除源码

3、软件包管理器(package)

RT-Thread 提供一个软件包管理平台,这里存放了官方提供或开发者提供的软件包。该平台为开发者提供了众多可重用软件包的选择,这也是 RT-Thread 生态的重要组成部分。package 为开发者提供了软件包的下载、更新、删除等管理功能

pkgs --upgrade 命令是用来升级 Env 功能脚本本身和软件包列表的。没有最新的包列表就不能选择最近更新的软件包。

pkgs --update 命令是用来更新软件包本身的,比如说你在 menuconfig 中选中了 json 和 mqtt 的软件包,但是退出 menuconfig 时并没有下载这些软件包。你需要使用 pkgs --update 命令,这时候 Env 就会下载你选中的软件包并且加入到你的工程中去。

menuconfig -s/--setting 命令用来修改Env的默认配置,如果不想每次更换软件包后使用 pkgs --update 命令,在使用 menuconfig -s/--setting 命令后配置 Env 选择每次使用 menuconfig 后自动更新软件包即可。

 十、RT-Thread Studio

RT-Thread 一站式开发工具,主要包括工程创建和管理,代码编辑,SDK管理,RT-Thread配置,构建配置,调试配置,程序下载和调试等功能,结合图形化配置系统以及软件包和组件资源,减少重复工作,提高开发效率。

  • 64
    点赞
  • 365
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答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指导手册的帮助下都能够更方便、更快捷地完成应用开发和维护工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值