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 用于指定主要配置文件,不能不加区分地替换。
menuconfig
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 代码。