本帖最后由 susutata 于 2024-11-10 20:20 编辑
#申请原创# @21小跑堂
利用 Kconfig 实现APM32项目的可视化配置
## 01 前言 最早接触到 `Kconfig` 文件是在使用 `ESP32` 的时候,`ESP-IDF` 的配置文件就是使用 `Kconfig` 文件来进行配置的。后来发现在 `linux` 、`RT-Thread` 和 `Zephyr` 等项目中也有使用到 `Kconfig` 来进行项目配置。可以看出 `Kconfig` 在嵌入式领域大型项目中有着广泛的应用。
从实际项目开发的角度来看,会经常需去使能或者关闭某些功能、修改一些参数,这些参数可能会影响到代码的编译、运行、功能等。如果这些参数是直接写在代码中的,那么每次修改参数都需要修改代码,然后重新编译,这样的效率是非常低的。而使用 `Kconfig` 文件来进行配置,可以在不修改代码的情况下,通过配置文件来修改参数,然后重新编译即可。
这里举两个使用场景来说明如果没有用 `Kconfig` 文件来进行配置,一般会怎么做。
### 预编译场景 在命令行中通过 `-D` 宏定义来控制代码的编译,例如: - gcc -DCONFIG_FEATURE_A -DCONFIG_PARAM_B=100
- #define CONFIG_FEATURE_A
- #define CONFIG_PARAM_B 100
### 代码条件编译场景 在代码中通过 `#ifdef` 来控制代码的编译,例如:
- #define CONFIG_FEATURE_A
- #ifdef CONFIG_FEATURE_A
- // do something
- #endif
上面的两种方式在小型项目中还是可以接受的,但是在大型项目中,当参数很多时,这样的方式就会变得非常不方便,且不直观。而 `Kconfig` 就是为了解决这个问题而生的工具。
## 02 Kconfig 环境搭建 推荐使用 `python` 来安装 [Kconfiglib](https://pypi.org/project/kconfiglib) ,同时还要用到 `menuconfig` 来进行可视化配置。要注意的是,在 `windows` 下使用 `menuconfig` 还需要安装 `curses` 库。
- python -m pip install windows-curses
- python -m pip install kconfiglib
安装完成后,可以使用以下命令来检查 `Kconfig` 和 `menuconfig` 的安装情况:
- PS E:\workspaces\Project\github\embedded\omni-sdk> pip show Kconfiglib
- Name: kconfiglib
- Version: 14.1.0
- Summary: A flexible Python Kconfig implementation
- Home-page: https://github.com/ulfalizer/Kconfiglib
- Author: Ulf "Ulfalizer" Magnusson
- Author-email: ulfalizer@gmail.com
- License: ISC
- Location: c:\users\lin\appdata\local\programs\python\python39\lib\site-packages
- Requires:
- Required-by:
- PS E:\workspaces\Project\github\embedded\omni-sdk> menuconfig -h
- usage: menuconfig [-h] [KCONFIG]
- Overview
- ========
- A curses-based Python 2/3 menuconfig implementation. The interface should feel
- familiar to people used to mconf ('make menuconfig').
- Supports the same keys as mconf, and also supports a set of keybindings
- inspired by Vi:
- J/K : Down/Up
- L : Enter menu/Toggle item
- H : Leave menu
- Ctrl-D/U: Page Down/Page Up
- G/End : Jump to end of list
- g/Home : Jump to beginning of list
环境搭建完成后,就可以利用 `Kconfig` 来生成 `.config` 配置文件,但是这个文件的内容还需要转换为宏定义才能被 C 语言项目用来进行配置。
`.config` 文件格式:
|