NextPilot开发指南(21):终于用上强大的Kconfiglib库

NextPilot飞行系统基于国产RT-Thread嵌入式实时操作系统进行打造。RT-Thread采用SCons + Kconfig 进行项目的配置和构建,C语言项目的裁剪配置本质上通过条件编译和宏的展开来实现的,RT-Thread借助Kconfig这套机制更方便的实现了这一功能。

由于历史原因RT-Thread V5.1.0及之前版本均借助kconfig-frontends工具解析Kconfig文件。而kconfig-frontends历史悠久,很多特性和功能已经跟不上时代,也逐渐被linux抛弃了。

终于RT-Thread的Kconfig配置系统在最近迎来的重大升级:[Feature] 添加kconfiglib全面支持,放弃kconfig-frontends by Later-Comer · Pull Request #9050 · RT-Thread/rt-thread (github.com)

注意:为了配合RT-Thread更新kconfiglib工具,env master和env-windows v2.0也同步升级了,新的工具链无法兼容RT-Thread v5.1.0及之前版本,老版本RT-Thread需要使用env v1.5.x和env-windows v1.5x

Kconfiglib简介

Kconfiglib是一个Python2/3库,用于解析和操作Kconfig配置文件,这些文件在Linux内核和其他开源软件中广泛使用。通过使用Kconfiglib,您可以更轻松地与Kconfig文件交互,例如生成菜单配置界面、读取和设置变量值以及自动完成功能。

安装kconfiglib库

可以通过pip来安装kconfiglib:

pip install kconfiglib

从kconfiglib v13.0.0开始,windows环境下需要自行安装windows-curses:

pip install windows-curses

pip安装工具会自动生成以下可以执行程序:

  • menuconfig:命令行版本
  • guiconfig:图形用户界面版本
  • oldconfig:update an old .config file after the Kconfig files have changed
  • olddefconfig
  • savedefconfig
  • defconfig: generate the initial configuration from an existing configuration file.
  • alldefconfig
  • allnoconfig
  • allmodconfig
  • allyesconfig
  • listnewconfig
  • genconfig:generate a header file, by default, it is saved as config.h. Normally, genconfig would be run automatically as part of the build.
  • setconfig

kconfiglib扩展功能

相比kconfig-frontends,kconfiglib引入很多新的扩展功能,更加方便的管理Kconfig文件:

  • source语句(只支持绝对路径)支持路径模糊匹配,比如
# 引用当前目录下下级子文件中Kconfig文件
source "*/Kconfig"
  • 新增osource(option source)语句,当引用Kconfig文件不存在的不会报错,同样支持模糊匹配
  • 新增rsource(relative source)语句,支持采用相对路径引用Kconfig文件,source和osource只能使用绝对路径
  • 新增orsource(option relative source)语句,采用相对路径引用Kconfig,如果文件不存在不会报错
  • 抛弃option env语句,环境变量直接在source和mainmenu等语句中展开,比如
# 假如定义了环境变量export PKGS_DIR=~/.rtenv,那么可以直接在Kconfig中使用

source "$PKGS_DIR/Kconfig"
  • 在kconfig中定义变量,使用 := 赋值,使用$(var_name)引用
# 将类型定义在变量里面
MY_TYPE := bool
config PKG_USING_MAVLINK
    MY_TYPE "enable mavlink package"
    default n

# 定义3个变量,在后面引用
RANGE_MIN := 1
RANGE_MAN := 3
RANGES : = 1  3
if PKG_USING_MAVLINK
    config MAVLINK_INSTANCE_COUNT
        int "mavlink instance count"
        range $(RANGE_MIN) $(RANGE_MAX)
    
    config MAVLINK_INSTANCE_COUNT_2
        int "mavlink intance count 2"
        range $(RANGES)
endif

menuconfig用户接口

  • menuconfig.py,是基于命令行终端的Kconfig配置接口

menuconfig用户接口

guiconfig.py,是基于Tkinter图形用户界面的Kconfig配置接口,

guiconfig用户接口

Kconfig语言

Kconfig语言:Kconfig Language — The Linux Kernel documentation

Kconfig 采用 # 作为注释标记符,例如:

# This is a comment

menu/endmenu

menu 语句用于生成菜单。

menu "Hardware Drivers Config"
    config BSP_USING_COM2
        bool "Enable COM2 (uart2 pin conflict with Ethernet and PWM)"
        select BSP_USING_UART
        select BSP_USING_UART2
        default n
    config BSP_USING_COM3
        bool "Enable COM3 (uart3 pin conflict with Ethernet)"
        select BSP_USING_UART3
        default n
endmenu

menu 之后的字符串是菜单名。menu 和 endmenu 间有很多 config 语句,以上代码对应的配置界面如下所示

其中 Hardware Drivers Config 就是菜单名,然后进入这个菜单有 Enable COM2、Enable COM3 等选项,如下图所示

menuconfig

menuconfig 语句表示带菜单的配置项。

menu "Hardware Drivers Config"
    menuconfig BSP_USING_UART
        bool "Enable UART"
        default y
        select RT_USING_SERIAL
        if BSP_USING_UART
            config BSP_USING_UART1
                bool "Enable UART1"
                default y

            config BSP_UART1_RX_USING_DMA
                bool "Enable UART1 RX DMA"
                depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
                default n
        endif
endmenu

当没有打开串口 DMA 配置时,以上代码对应的界面为

当打开串口 DMA 配置时,以上代码对应的界面为

语句分析:

  • menuconfig 这个语句和 config 语句很相似,但它在 config 的基础上要求所有的子选项作为独立的行显示。
  • depends on 表示依赖某个配置选项,depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA 表示只有当 BSP_USING_UART1 和 RT_SERIAL_USING_DMA 配置选项同时被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项

config

config 定义了一组新的配置选项。

config BSP_USING_GPIO
    bool "Enable GPIO"
    select RT_USING_PIN
    default y
    help
    config gpio

以上代码对应的配置界面如下所示

语句分析:

config 表示一个配置选项的开始,紧跟着的 BSP_USING_GPIO 是配置选项的名称,config 下面几行定义了该配置选项的属性。属性可以是该配置选项的

  • 类型
  • 输入提示
  • 依赖关系,select 是反向依赖关系的意思,即当前配置选项被选中,则 RT_USING_PIN 就会被选中。
  • 默认值,default 表示配置选项的默认值,bool 类型的默认值可以是 y/n。
  • 帮助信息,help 帮助信息。

配置类型有:

  • bool 表示配置选项的类型,每个 config 菜单项都要有类型定义,变量有5种类型
  • bool 布尔类型
  • tristate 三态类型
  • string 字符串
  • hex 十六进制
  • int 整型

choice/endchoice

choice 语句将多个类似的配置选项组合在一起,供用户选择一组配置项。

menu "Hardware Drivers Config"
    menuconfig BSP_USING_ONCHIP_RTC
        bool "Enable RTC"
        select RT_USING_RTC
        select RT_USING_LIBC
        default n
        if BSP_USING_ONCHIP_RTC
            choice
                prompt "Select clock source"
                default BSP_RTC_USING_LSE

                config BSP_RTC_USING_LSE
                    bool "RTC USING LSE"

                config BSP_RTC_USING_LSI
                    bool "RTC USING LSI"
            endchoice
        endif
endmenu

以上代码对应的配置界面为

语句解析:

  • choice/endchoice 给出选择项,中间可以定义多个配置项供选择,但是在配置界面只能选择一个配置项;
  • prompt 给出提示信息,光标选中后回车进入就可以看到多个 config 条目定义的配置选项,所以下面的两个例子是等价的:
bool "Networking support"

bool
prompt "Networking support"

if/endif

if/endif 语句是一个条件判断,定义了一个 if 结构,示例代码如下:

menu "Hardware Drivers Config"
    menuconfig BSP_USING_CAN
        bool "Enable CAN"
        default n
        select RT_USING_CAN
        if BSP_USING_CAN
            config BSP_USING_CAN1
                bool "Enable CAN1"
                default n
        endif
endmenu

当没有选中 "Enable CAN" 选项时,下面通过 if 判断的 Enable CAN1 选项并不会显示出来,如下图所示

source

source 语句用于读取另一个文件中的 Kconfig 文件,如:

source "../libraries/HAL_Drivers/Kconfig"

上述语句用于读取当前 Kconfig 文件所在路径的上一级文件夹 libraries/HAL_Drivers 下的 Kconfig 文件。

comment

comment 语句出现在界面的第一行,用于定义一些提示信息。

menu "Hardware Drivers Config"
    comment "uart2 pin conflict with Ethernet and PWM"
    config BSP_USING_COM2
        bool "Enable COM2"
        select BSP_USING_UART
        select BSP_USING_UART2
        default n
endmenu

Kconfig macro语言

Kconfig macro语言:Kconfig macro language — The Linux Kernel documentation

变量

Kconfig macro language — The Linux Kernel documentation

内置函数

Kconfig macro language — The Linux Kernel documentation

参考资料

GitHub - ulfalizer/Kconfiglib: A flexible Python 2/3 Kconfig implementation and library

Kconfig Language — The Linux Kernel documentation

Kconfig macro language — The Linux Kernel documentation

Kconfig - Tips and Best Practices — Zephyr Project Documentation

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值