跳到主要内容

Kconfig 配置

经常有人把 Kconfig 文件和 prj.conf 当成同一件事。前者描述“允许配置什么”,后者写“这次构建希望取什么值”。最终结果在 build 下的 .config,依赖条件也参与决定结果。

配置符号定义​

打开 learning-app/Kconfig:

mainmenu "Learning application"
source "Kconfig.zephyr"

config APP_PERIOD_MS
int "Loop period in milliseconds"
range 100 10000
default 1000

source "Kconfig.zephyr" 继续引入 Zephyr 的配置树。config APP_PERIOD_MS 定义整数符号;它的名字在 Kconfig 里不带 CONFIG_。range 限制合法范围,default 是没有其他有效赋值时的默认值。

prj.conf 中则写:

CONFIG_APP_PERIOD_MS=1000

生成头文件让 C 程序能使用 CONFIG_APP_PERIOD_MS。如果你只在 prj.conf 写一个根本没有定义的符号,构建会警告或失败;这不是创建新参数的方法。

布尔选项与依赖​

本例还有:

config APP_BACKLIGHT
bool "Toggle board backlight as GPIO"
depends on GPIO
default n

只有 GPIO 的依赖条件满足,APP_BACKLIGHT 才能启用。这里有意用 depends on,让依赖可见,而不是用 select 强行拉起任意功能。select 适合明确受控的内部依赖,用错会绕过被选符号自己的约束。

#ifdef CONFIG_APP_BACKLIGHT 中的代码只在功能开启时参与编译。把开关设为 n 不仅改变行为,也可能让某些代码和数据不进入固件。

公共配置和实验配置​

prj.conf 保存应用常用设置,backlight.conf 保存背光实验的差异:

CONFIG_APP_BACKLIGHT=y
CONFIG_APP_PERIOD_MS=500

构建时通过额外配置叠加:

cd ~/Projects/zephyr-main-workspace/zephyr
west build -p always -b esp32s3_touch_lcd_1_28/esp32s3/procpu \
~/Projects/zephyr-docs/examples/learning-app -d build/learning-backlight \
-- -DEXTRA_CONF_FILE=backlight.conf \
-DDTC_OVERLAY_FILE=boards/waveshare.overlay

本例显式传入 overlay,因此不会依赖读者记住不同版本的自动发现规则。EXTRA_CONF_FILE 补充默认配置;CONF_FILE 用于指定主要配置文件,不能不加区分地替换。

west build -d build/learning-backlight -t menuconfig

使用搜索功能查 APP_BACKLIGHT 或 GPIO,观察类型、当前值、依赖与来源。退出后,想长期保留的值要整理回源码配置文件;菜单保存到构建目录并不等于 Git 仓库已经保存。

rg 'CONFIG_APP_|CONFIG_GPIO' build/learning-backlight/zephyr/.config

预期为 APP_BACKLIGHT=y、APP_PERIOD_MS=500、GPIO=y。

配置诊断​

  • 未定义符号:检查名称是否拼错、当前版本有没有该符号、自定义 Kconfig 是否被载入。
  • 请求 y、结果 n:读依赖表达式,不要重复写 CONFIG_X=y。
  • 数值超出范围:检查 range;把本例周期设为 50 可以观察诊断,结束练习后恢复合法值。
  • 修改没有影响:检查构建的应用目录、额外配置文件和最终 .config,必要时用 pristine 重配。

配置合并后仍会执行依赖求值,因此“最后写入 y”不是强制启用驱动的保证。

配置文件职责​

文件维护者内容
应用 Kconfig应用作者自己的参数定义
prj.conf / 额外 .conf应用作者本次固件功能选择
板卡 _defconfig / Kconfig.defconfig板卡维护者基础默认值、板级条件
生成的 .config构建系统最终结果,用于排错

不要为了某个应用打开 LVGL,就把所有 UI 功能塞进板卡 defconfig。板卡默认值应服务于硬件基础支持,应用决定自己要做什么。

来源:配置值设置。下一章:把硬件信息连接到 C 代码。