目录

一、概述

二、架构

三、版本选择

四、内核启动流程

五、自动初始化机制

六、内核对象模型

七、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 文件的方式,而是使用 SConstruct 和 SConscript 文件来组织源码结构。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配置,构建配置,调试配置,程序下载和调试等功能,结合图形化配置系统以及软件包和组件资源,减少重复工作,提高开发效率。

RT-Thread实时操作系统简介相关推荐

  1. 实时操作系统---任务管理

    目录 系列文章目录 前言 一.任务的创建 二.任务的栈空间 三.任务的挂起和恢复 1.挂起任务 2.恢复任务 四.删除任务 系列文章目录 第一章裸机系统与操作系统 第二章操作系统分类 第三章实时操作系 ...

  2. linux 内核rt,实时操作系统kernel rt

    https://blog.csdn.net/baidu_34045013/article/details/78886617 实时应用程序在某些触发事件和应用程序对该事件的响应之间有操作截止日期.为了满 ...

  3. [精华] nucleus实时操作系统MTK手机软件系统工程和配置简介

    [精华] nucleus实时操作系统MTK手机软件系统工程和配置简介 http://www.chinaunix.net 作者:wheel  发表于:2009-02-27 15:18:33 [发表评论] ...

  4. 实时操作系统UCOS学习笔记1----UCOSII简介

    前面我们所有的实验都是跑的裸机程序(裸奔),从本章开始,我们开始介绍UCOSII(实时多任务操作系统内核). UCOSII简介 UCOSII的前身是UCOS,最早出自于1992年美国嵌入式系统专家Je ...

  5. 嵌入式系统开发16——嵌入式实时操作系统uC/OS的简介及简单应用

    本文主要介绍嵌入式实时操作系统(RTOS),并且以uc/OS为例,将其移植到stm32F103C8T6上,构建3个任务:其中两个task分别以1s和3s周期对LED灯进行点亮-熄灭的控制:另外一个ta ...

  6. 正点原子delay函数移植到rt thread操作系统(HAL库)

    正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...

  7. RTEMS实时操作系统精要(1)-简介

    最早用于美国国防系统,早期的名称为实时导弹系统(Real Time Executive for Missile Systems),后来改名为实时军用系统(Real Time Executive for ...

  8. 单片机嵌入式实时操作系统RTOS---eOS学习入门级RTOS(原创)

    笔者刚入门学习STM32的时候就接触了uCOSII,它的多任务让我眼前一亮:原来程序还可以这么写!它让很多冲突的代码都能各自运行,在一个单片机上实现了多个单片机共同运行的效果.但是当开始真正去学习它时 ...

  9. 什么是真正的实时操作系统

    做嵌入式系统开发有一段时间了,做过用于手机平台的嵌入式Linux,也接触过用于交换机.媒体网关平台的VxWorks,实际应用后回过头来看理论,才发现自己理解的肤浅,也发现CSDN上好多同学们都对实时. ...

最新文章

  1. JBoss、Tomcat Classloader不完全分析
  2. 指尖检测的几种新方法
  3. 如何选择漏电保护器规格型号_老师傅告诉你:电路跳闸如何解决
  4. 2. 字符串、向量和数组
  5. WinFom解决最小化最大化后重绘窗口造成闪烁的问题
  6. Matlab常用的标记符号和颜色
  7. python批量图片自动编码
  8. 11-411/611NLP Lecture 4.Words and Morphology
  9. 操作系统课程设计报告(文件系统)
  10. Linux和Windows双系统下,找回丢失Windows启动项
  11. 《神经科学:探索脑》学习笔记(合集)
  12. 声音频率和乐器知识记录
  13. Traffic Manager
  14. android 中文编码
  15. mysql通过ip地址进行访问
  16. 车载通信——J1939故障码
  17. GET请求中文乱码问题如何解决
  18. 在s7 1200中模拟量的应用
  19. SDN(五) Netgear R6220从刷机到配置 OpenvSwitch交换机
  20. android 接口403,403: 请求被理解,但它被拒绝 Twitter Android_android_开发99编程知识库...

热门文章

  1. 【微软官方】VC++运行库支持库
  2. 腾讯正式放弃独家版权,但欢呼“听歌自由”为时尚早
  3. Event Loop事件循环机制
  4. 全彩高清大屏LED大屏光纤收发器光电转换器兼容灵星雨/诺瓦LED光纤收发器 凯视达灵信光电转换器
  5. 如何修改Edusoho网络课堂系统V4.6.2顶部和底部及后台版权
  6. Hinton胶囊神经网络新作How to represent part-whole hierarchies in a neural network(一)
  7. 基于台达PLC的水箱液位PID控制(matlab处理数据)
  8. 用友ERP-U8报价
  9. 计算机培训ppt教案,solidworks培训教案
  10. 基于c++的扑克牌游戏