RTT项目Keil5自定义分组Scon和Kconfig配置

RTT项目Keil5自定义分组Scon和Kconfig配置

一、实现目标

我使用的是立创梁山派主控GD32F470ZGT6开发板,rtt的bsp中已经有了相关的项目模板,使用dist命令,会把当前的配置生成为单独的工程模板,复制这份工程到你需要存放的路径,在这个工程中进行项目开发,这样不会污染源码中工程。

立创梁山派开发板bsp路径如下:

Image

在生成的项目路径根目录下进入env工具,我这里是默认,也就是进去了,但没有开/关任何配置。然后pkgs --update更新项目软件包,再scons --target=mdk5,生成mdk5工程。

打开Keil5后,分组如下:

Image

我需要新建一个分组叫:my_device_drivers,表示我的项目的设备驱动,再添加两个设备驱动文件到该分组中,分别是:mlx90614.c、max17048g.c。

二、步骤

1.在根目录下创建文件夹components

整体路径如下:
image

Image

components下的SConscript

可以理解这里是该目录下的SConscript,顶层脚本会遍历下一层目录,会找到当前这个py脚本,该脚本会再去找下一层的py脚本,最后执行SConscript()把对应的文件路径、分组添加到项目中。

里面的print函数会打印当前路径,同时也表示该脚本正常运行。

import os
from building import *
cwd = GetCurrentDir()
print('current path:'+cwd)
objs = []
sub_items = os.listdir(cwd)

for d in sub_items:
    path = os.path.join(cwd,d)
    if os.path.isfile(os.path.join(path,'SConscript')):
        objs = objs+SConscript(os.path.join(d,'SConscript'))

Return('objs')

根目录下SConscript,自带的,未改动,这里只是放出来阅读。

# for module compiling
import os
Import('RTT_ROOT')
from building import *

cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)

for d in list:
    path = os.path.join(cwd, d)
    if os.path.isfile(os.path.join(path, 'SConscript')):
        objs = objs + SConscript(os.path.join(d, 'SConscript'))

Return('objs')

这个py脚本会获取当前根目录路径,然后把该目录下的文件夹放到名为list中,然后遍历这些文件夹下的SConscript脚本。

2.max17048g目录下配置

SConscsript

from building import *
import os

print('max17048g SConscript is running')
cwd = GetCurrentDir()
#include_path = [cwd]
src = []
CPPPATH = [cwd]

if GetDepend(['USING_MAX17048G']):
    src += Glob('*.c')
print(src)
group = DefineGroup('my_device_drivers',src,depend = ['USING_MAX17048G'],CPPPATH = CPPPATH)

Return('group')

这个脚本会先判断宏USING_MAX17048G是否存在,这个宏在rtconfig.h中,通过env工具menuconfig图形配置来对宏进行配置,如果存在就把当前目录下的所有.c文件添加到src中,最后定义分组my_device_drivers。

Kconfig

menu "MAX17048G Driver Options"
        menuconfig USING_MAX17048G
                bool "Enable Voltameter(MAX17048G)"
                default n
                select RT_USING_I2C         # 自动依赖I2C总线驱动
                select RT_USING_I2C_BITOPS  #自动依赖软件I2C框架
                help
                        Enable MAX17048G Voltameter Sensor driver.
                        This sensor uses I2C interface.
                if USING_MAX17048G
                        #可选的配置选项
                        config MAX17048G_I2C_BUS
                                string "I2C bus name"
                                default "i2c1"
                        config MAX17048G_I2C_ADDR
                                hex "I2C slave address(hex)"
                                default 0x3C
                                range 0x00 0x7F
                                help
                                        The I2C slave address of the sensor. Typical value is 0x3C.
                endif
        endmenu

如果对Kconfig不熟悉,请看rtt的Kconfig文档。

链接:https://www.rt-thread.org/document/site/#/development-tools/build-config-system/Kconfig

3.mlx90614下配置文件

SConscript

from building import *
import os

print('mlx90614 SConscript is running')
cwd = GetCurrentDir()
#include_path = [cwd]
src = []
CPPPATH = [cwd]

if GetDepend(['PKG_USING_INFRARED_TEMP']):
    src += Glob('*.c')
print(src)
group = DefineGroup('my_device_drivers',src,depend = ['PKG_USING_INFRARED_TEMP'],CPPPATH = CPPPATH)

Return('group')

这个脚本会先获取当前路径,然判断宏PKG_USING_INFRARED_TEMP是否存在,如果存在就把当前路径下.c文件添加到src中,最后定义到my_device_drivers分组中。这里使用同一个分组名,可以把不同的.c文件添加到该分组当中。

Kconfig

menu "MLX90614 Driver Options"
        menuconfig PKG_USING_INFRARED_TEMP
                bool "Enable Infrared Thermometer(MLX90614)"
                default n
                select RT_USING_I2C    # 自动依赖I2C总线驱动
                select RT_USING_I2C_BITOPS #自动依赖软件I2C框架
                help
                        Enable MLX90614 Infrared Temperature Sensor driver.
                        This sensor uses I2C interface.
                if PKG_USING_INFRARED_TEMP
                        #可选的配置选项
                        config INFRA_RED_I2C_BUS
                                string "I2C bus name"
                                default "i2c1"
                        config INFAR_RED_I2C_ADDR
                                hex "I2C slave address(hex)"
                                default 0x5A
                                range 0x00 0x7F
                                help
                                        The I2C slave address of the sensor. Typical value is 0x5A.
                endif
        endmenu

这里不作解释,具体参考rtt的Kconfig说明文档。

4.根目录下的SConscript(顶层)配置

由于根目录下的SConscript(顶层)会自动找子目录(仅一层)的SConscript,我们在components中已有这个文件,所以,顶层SCoscript不用改动。

我们添加了两个设备驱动的Kconfig,所以需要在当前项目中的Kconfig中添加这两个的来源,这样使用menuconfig就可以看到配置的选项了,添加路径来源如下:

Image

至此,添加自定义分组、源文件已经完毕,接下来验证一下是否正常。

三、验证

1.env工具中menuconfig验证

env工具中menuconfig,已经显示出这两个设备的配置了。

Image

Image

选中两个设备为*。按下ESC键退出,y保存。

2.生成项目

使用pkgs --update更新软件包,接着生成mdk项目,scons --targe=mdk5

使用Keil5打开项目工程:

Image

已经新建了分组,并且把刚才的设备驱动添加了进来。因为在脚本中指定了路径,这里直接#include就可以使用了。

四、总结

rtt项目使用env工具,使用SCon来进行项目构建,根目录下(顶层)的SConscript脚本和SConstruct会对整个项目的脚本进行路径查找,最终执行,顶层Kconfig会对子目录的Kconfig进行声明,Kconfig其实就是对应menuconfig中的配置,最终保存退出后会在rtconfig.h中看到对应的宏,然后py脚本其实会读取这个.h文件,对其中的宏进行读取等操作,然后py脚本就可以灵活的对工程进行操作了。

posted @ 2026-06-05 21:29  中断听雪  阅读(8)  评论(0)    收藏  举报