RTT 是如何管理和构建工程的?
扫描二维码
随时随地手机看文章
前言
rtthread 是一个功能强大,组件丰富的物联网操作系统。它相比于其他的 RTOS 的一个主要区别之一,也就是它不仅仅是一个实时内核,还具备丰富的中间层组件。那对于 rtt 来讲,它又是如何管理和构建工程的呢?下面笔者将从一个工程的目录结构开始来进行阐述。
工程目录结构
下图是一个STM32f4 基于 rtt 的一个工程目录:
这个目录所包含的文件夹的具体功能也能够从其文件夹名得知,这里笔者简单的说一下:
.vscode:这个 文件夹所包含的是当前 vscode 环境的一些设置,如果没有这个文件夹,那么在阅读代码的时候,就会出现好多头文件找不到的情况。
applications:这个文件夹是用户应用程序所在的文件夹,main.c 就在这个文件夹下,如果用户的应用程序不是很多的情况下,那么都可以将其放到这个文件夹下。
board:针对于 STM32 来讲,在使用 rtt 的时候,采用的是 CubeMX 来配置单片机外设的功能,这个文件夹存放的就是经过 CubeMX 配置之后的相关文件。
libraries:在配置单片机外设的时候,我们无外乎会使用到单片机的库,针对于 STM32 来讲,存在标准库,也有 HAL 库,这里使用的是 HAL 库,所以这个文件夹下面存放的是 HAL 库的相关文件。
packages:rtt 存在丰富的软件包,这个文件夹存放的就是我们使用的软件包的相关文件。
rt-thread:这个文件夹存放的就是 rtt 内核以及组件的相关文件。
rtconfig.h:这个是极为关键的一个文件,rtt 进行内核裁剪实际上也就是通过这个文件里的宏定义来关闭或者打开 rtt 所具备的功能。
rtconfig.h 文件配置
上述我们介绍了基于 rtt 的一个 STM32 的工程目录,紧接着我们来看 rtconfig.h 文件,这个文件里存放的全是宏定义,换句话说就是通过在这个文件里增加或者删减相关宏定义从而实现 rtt 的相关功能。最为直观的修改方法便是手动修改了,直接在 rtconfig.h 文件里敲代码解决。另一种方法便是 rtt 引入的一种自动修改的机制,也就是引入的 Env 工具,Env 工具如何使用就不在这里阐述了,官方文档有详细地介绍。那如何通过 Env 工具来配置 rtconfig.h 文件呢,通过在 Env 里输入 menuconfig 命令,会出现下图所示的界面,通过图形化的操作就可以实现相关的配置。
通过这个界面我们来选择要使用的组件以及相关的软件包,而上图这个界面里的内容又是和 kconfig 文件相对应的,也就是说我们可以通过 kconfig 文件来配置我们的 menuconfig 界面,然后通过 menuconfig 界面来配置及我们的 rtconfig.h 文件,举一个简单的例子说明这个问题,我们通过 CubeMX 配置了单片机的相关外设,那如果要在 rtt 中使用这个外设的相关功能,那么我们就需要在 rtconfig.h 中开启相关的宏定义,但是这个时候 menuconfig 中还没有关于这个外设的相关选项,那么就需要在 kconfig 文件里进行设置,假设我们要使用 GPIO 的功能,那么相关内容如下所示:
menuconfig 界面所对应的内容如下图所示:
在 menuconfig 界面选择了之后,我们再来看 rtconfig.h 里对应的宏定义。
上图的左边是 kconfig 文件,右边是 rtconfig.h 文件,可以看到是一一对应的(RT_USING_PIN也是对应的,由于不在一个位置所以没有截图下来)。
上述阐述了一个 kconfig 文件与 rtconfig.h 文件以及 menuconfig 之间的对应关系,但是一个工程存在好多个 kconfig 文件,运行 menuconfig 的时候又是如何找到各个 kconfig 文件的呢?整个过程是这样的,在当前工程的根目录存在一个 kconfig 文件,所在位置和内容如下图所示:
上图中红色方框里的内容就是其他 kconfig 文件的路径,因此这个文件是所有配置的总入口,通过它找到其他 kconfig 文件。
小结
上述简单叙述了一个 rtconfig.h 文件的配置过程,总结一下也就是在工程的根目录下使用 env 工具执行 menuconfig 命令时会出现 rtt 系统的配置界面,所有的配置选项都是通过读取工程根目录下的 kconfig 文件,然后通过此文件找到其他的 kconfig 文件,从而生成配置界面,然后通过选择配置界面的相关选项,从而实现在 rtconfig.h 文件里增添或者减少宏定义的目的。
scons
引用 rtt 文档中心的一句话来介绍 scons:
scons 是一套由 Python 语言编写的开源构建系统,类似于 GNU Make,它采用不同于通常 Makefile 文件的方式,而是使用 SConstruct 和 SConscript 文件来替代。这些文件也是 Python 脚本,能够使用标准的 Python 语法来编写。所以在 SConstruct、SConscript 文件中可以调用 Python 标准库进行各类复杂的处理,而不局限于 Makefile 设定的规则。
使用 makefile 时,我们可以通过命令行输入 make 来编译工程,在使用 scons 时,同样的道理,我们也可以使用 scons 来编译工程,如图所示:
在 scons 的介绍里说,scons 通过 SConscript 和 SConstruct 文件来组织源码结构,而通常来说一个项目中只有一个 SConstruct,但是会存在多个 SConscript,SConstruct 所在的位置如下图所示:
可以看到 SConstruct 处在工程的根目录下,上图还标识了一个文件是 rtconfig.py ,这个文件的作用是为了使得 rtt 更好地支持多种编译器,以及方便地调整编译参数。
再来看 SConscript ,一般来讲,每个存放着源代码的子目录下都会放置着一个 SConscript,如果想要将自己的一些源代码加入到 Scons 编译环境中,一般可以创建或修改已有的 SConscript,它可以控制源文件的加入,并且可以指定文件的 Group,如果是在 keil 或者 iar 中开发,那么通过 SConscript 文件就可以自动地添加文件或者增加 Group 到 keil 工程中,下面以 keil 工程为例说明,首先看对应的 SConscript 文件。
在这里不去细致地分析每一个语句,文档中心有详细地叙述,以 keil 为例,SConscript 中箭头所指向的 group 在 keil 中所体现的就是加入到 keil 中的工程,第一个 group 中定义的 group 名称是 Applications,那么所对应的在 keil 工程中就有一个 Applications 的 group。第二个 group 中定义的 group 名称是 Drivers,那么所对应的在 keil 中就有一个 Drivers 存在,如下图所示:
其他 group 的添加原理也是类似的,同样的,SConscript 还能够控制将什么文件加到其对应的 group 中,在 SConscript 中, src 变量控制的就是文件的加入,以 Application 下的文件为例,如下图所示:
可以看到这里的 src 所代表的意思就是将当前文件夹下的所有 .c 文件加入到 Application 中,这里也可以控制指定的文件加入到对应的 group 中。
这里需要注意的一点是我们通过编辑 SConscript 文件,来控制文件和 group 的加入,在 keil 中开发的话,我们会在 Env 中输入 scons --target=mdk5
来创建我们的工程,这个时候,我们要添加的文件或者 group 就会自动地添加到工程中了,如果这个时候,手动的往 keil 中添加文件或者 group 时,那么在下次运行 scons --target=mdk5
时就会将之前手动添加到 keil 工程的文件或 group 删除掉。另外,如果在 keil 中开发时,有一些 keil 本身的设置需要进行更改,那么为了避免重新生成工程时将修改的记录覆盖掉,这个时候就应该在 template 这个工程中进行设置,这样进行更改后,即便重新生成工程了,但是关于 keil 的配置依旧保留着,工程所在位置如下图所示:
同时,scons 还能够生成 vs code 工程,运行 scons --target=vsc
就能够更新 vs code 工程的相关配置,从而更新 vs code 的相关头文件设置。
总结
上述就是关于 RTT 管理和构建工程的相关内容了,总结一下也就是涉及到 kconfig 文件的更改,从而能够通过 menuconfig 图形化的配置相关选项,最终能够生成 rtconfig.h 中的相关宏定义。同时,RTT 采用 scons 来进行构建工程,通过 SConscript 控制文件和 group 加入到工程中进行编译。另一方面,上述内容所涉及的语法虽然不是采用的 C 语言,但是在 rtt 中所涉及的语法中也比较容易,通过阅读官方文档中心的相关内容也就能够运用起来了,好了,这次的分享内容就是这些啦~
如果觉得文章对您有帮助,欢迎点击再看支持一下呐~
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!