添加文件到工程
BSP下的applications文件夹用于存放用户自己的应用代码,目前只有一个main.c文件,如果用户的应用代码不是很多,建议相关源文件都放在这个文件夹下面,在applications文件夹下新增两个简单的文件hello.c和hello.h。
applications文件夹下新增的2个文件需要使用scons --target=xxx命令生成新的工程,才会添加到工程项目中。每次新增文件都要重新生成工程。
applications文件夹下新增的文件是怎么样添加到工程中的呢?每个BSP的applications文件夹里都有一个SConscript文件,这些文件的功能都相似。
RTT使用SCons构建系统,SCons使用SConscript和SConstruct文件来组织源码结构。通常来说一个项目只有一个SConstruct,但是会有多个SConscript。一般情况下,每个存放有源代码的子目录下都会放置一个SConscript。
SConscript文件是使用Python语言编写,applications文件夹里面的内容如下:
Import('RTT_ROOT')
Import('rtconfig')
from building import *# str(Dir('#') 表示获取工程的 SConstruct 所在的目录, 也就是 D:\repository\rt-thread\bsp\stm32f4xx-HAL
# os.path.join() 表示将 `str(Dir('#')` 表示的目录和 applications 一起拼接成一个完整目录。
# 也就是获得当前目录 `D:\repository\rt-thread\bsp\stm32f4xx-HAL\applications`
cwd = os.path.join(str(Dir('#')), 'applications')# 获取当前目录下所有的 C 文件
src = Glob('*.c')# 将当前目录和 SConstruct 所在的目录保存到 list 变量 CPPPATH 中
CPPPATH = [cwd, str(Dir('#'))]# 将 src 包含的源文件创建为 Applications 组。depend 为空表示该组不依赖 rtconfig.h 中的任何宏。
# CPPPATH = CPPPATH 表示将右边 CPPPATH 变量包含的目录添加到系统的头文件路径中,左边的 CPPPATH 表示头文件路径。
# 这个 Applications 组也就对应 MDK 或者 IAR 工程里面的 Applications 分组。
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)Return('group')
通过这个SConscript文件,applications目录下的所有源文件和相关头文件目录就添加到了工程中,而不需要用户手动添加。
添加模块到工程
前文提到在自己源代码不多的情况下,建议所有源代码文件都放在applications文件夹里面。
同样以上文提到的hello.c和hello.h为例,需要把他们作为一个单独的模块管理,并且在MDK或者IAR的工程文件里有自己的分组,且可以通过menuconfig选中是否使用这个模块。在BSP下新增hello文件夹。
注意文件夹里多了一个SCoscript文件,如果想要将自己的一些源代码加入到SCons编译环境中,一般可以创建或修改已有SConscript文件。
SConscript 文件可以控制源码文件的加入,并且可以指定文件的 Group(与 MDK/IAR 等 IDE 中的 Group 的概念类似)。对于这个新增的 hello 模块 SConscript 文件内容如下,# 号后面的内容为注释。
# -*- coding: UTF-8 -*- # 指定文件的编码格式是 UTF-8,文件可以用中文
Import('RTT_ROOT')
Import('rtconfig')
from building import *cwd = GetCurrentDir() # 将当前路径赋值给字符串 cwd
include_path = [cwd] # 将当前头文件路径保存到 list 变量 include_path 中
src = [] # 定义一个 list 变量 srcif GetDepend(['RT_USING_HELLO']): # hello.c 依赖宏 RT_USING_HELLOsrc += ['hello.c'] # 保存 hello.c 字符串到 list 变量 src 中# 将 src 包含的源文件创建为 hello 组。depend 为空表示该组不依赖 rtconfig.h 的任何宏。
# CPPPATH = include_path 表示将当前目录添加到系统的头文件路径中
group = DefineGroup('hello', src, depend = [''], CPPPATH = include_path)Return('group')
通过上面几行简单的python代码就创建了一个新的hello分组,并且可以通过宏定义控制要加入到组里面的源文件。
增加menuconfig菜单
那么自定义宏RT_USING_HELLO又是通过怎样的方式定义呢?
这里要介绍一个新的文件Kconfig。
Kconfig用来配置内核,menuconfig命令通过读取工程的各个KConfig文件,生成配置界面供用户配置内核,最后所有配置相关的宏定义都会自动保存到BSP目录里的rtconfig.h文件中,每个BSP都有一个rtconfig.h文件,这也就是BSP的配置信息。