赞
踩
目录
RT-Thread 是一款完全由国内团队开发维护的集实时操作系统(RTOS)内核,文件系统、网络框架、设备框架等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接等能力的物联网操作系统,具有完全的自主知识产权。具有如下特点:
物联网相关的软件包: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 采用内核对象管理系统来访问 / 管理所有内核对象,内核对象包含了内核中绝大部分设施,这些内核对象可以是静态分配的静态对象,也可以是从系统内存堆中分配的动态对象;对象容器中包含了每类内核对象的信息,包括对象类型,大小等。对象容器给每类内核对象分配了一个链表,所有的内核对象都被链接到该链表上
RT-Thread提供了一套简单的I/O设备模型框架,对不同的I/O设备进行管理;它位于硬件和应用程序之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。这样使得设备的硬件操作与应用程序相互独立,双方只需关心各自的实现,从而降低代码的耦合性、复杂性、提高了系统的稳定性
应用程序通过 I/O 设备管理接口获得正确的设备驱动,然后通过这个设备驱动与底层 I/O 硬件设备进行数据(或控制)交互
I/O 设备管理层实现了对设备驱动程序的封装,对应用程序提供访问底层设备的标准IO接口
设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现
设备驱动层是一组驱使硬件设备工作的程序,实现访问硬件设备的功能。它负责创建和注册 I/O 设备,对于操作逻辑简单的设备,可以不经过设备驱动框架层,直接将设备注册到 I/O 设备管理器中
1、直接注册到I/O设备管理器中
2、先注册到设备驱动框架
- 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 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口;支持权限验证、自动补全、查看历史命令等功能
在设备端通常使用串口与PC机进行通讯
FinSH 支持两种输入模式,分别是传统命令行模式(msh)和 C 语言解释器模式(C-Style),它们可以切换;两种模式下的命令不通用。C-Style 模式在运行脚本或者程序时不太方便且占用体积较大,推荐使用msh模式
自定义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是RT-Thread 推出的开发辅助工具,提供Scons编译构建环境、menuconfig图形化系统配置及基于git的软件包管理功能。ENV带有 SCons 和 Python,在 windows 平台使用 SCons 则不需要安装这两个软件,但需要自行安装 git 并加入环境变量。
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 文件
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 语法 就能向项目中添加或者删除源码
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 一站式开发工具,主要包括工程创建和管理,代码编辑,SDK管理,RT-Thread配置,构建配置,调试配置,程序下载和调试等功能,结合图形化配置系统以及软件包和组件资源,减少重复工作,提高开发效率。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。