Zephyr学习 - 第 2 章:Kconfig——从配置请求到编译宏

发布时间:2026/7/22 3:06:07
Zephyr学习 - 第 2 章:Kconfig——从配置请求到编译宏 第 2 章Kconfig——从配置请求到编译宏验证方式源码、生成配置、native_sim/native/641. 本章要解决的问题本章的核心不是记住 Kconfig 语法而是理解这条链路Kconfig 定义“允许配置什么” prj.conf 请求“这次希望配置什么值” board/SoC/module 等其他配置输入 依赖、默认值、范围计算 ↓ build/zephyr/.config ↓ build/zephyr/include/generated/zephyr/autoconf.h ↓ C 代码中的 CONFIG_* 宏需要能够回答Kconfig与prj.conf有什么区别为什么prj.conf不是最终配置depends on不满足时发生什么为什么有些CONFIG_*是未定义而不是被定义为0IS_ENABLED()解决了什么问题2. 第一个核心概念定义与赋值分离实验目录C:\study\1-zephyr\labs\ch02_kconfig2.1Kconfig定义符号例如config LEARN_PERIOD_MS int Learning feature period in milliseconds default 1000 range 10 5000 depends on LEARN_FEATURE它定义符号名为LEARN_PERIOD_MS类型为整数默认值为1000合法范围为10..5000依赖LEARN_FEATUREprompt 决定 menuconfig 中显示的文字。这段定义没有要求本次构建一定使用哪个值。2.2prj.conf请求本次构建值CONFIG_LEARN_FEATUREy CONFIG_LEARN_PERIOD_MS250 CONFIG_LEARN_GREETINGKconfig is active CONFIG_LEARN_VERBOSEyprj.conf使用CONFIG_前缀对 Kconfig symbol 提出赋值请求。重要区别文件作用是否是最终结果Kconfig定义符号、类型、依赖、默认值、范围否prj.conf请求本次应用使用的值否zephyr/.configKconfig 计算后的最终配置是autoconf.h把最终配置转换为 C 宏是由构建生成3. 实验中的四种配置类型3.1 boolconfig LEARN_FEATURE bool Enable the learning feature default y常用值y或n。当值为y时通常生成#defineCONFIG_LEARN_FEATURE1当值为n时CONFIG_LEARN_FEATURE通常根本不定义而不是#defineCONFIG_LEARN_FEATURE03.2 intconfig LEARN_PERIOD_MS int default 1000 range 10 5000最终生成类似#defineCONFIG_LEARN_PERIOD_MS2503.3 stringconfig LEARN_GREETING string default hello from Kconfig最终生成 C 字符串宏#defineCONFIG_LEARN_GREETINGKconfig is active3.4 依赖控制的符号config LEARN_VERBOSE bool depends on LEARN_FEATURELEARN_FEATUREn时LEARN_VERBOSE不可见也不能有效启用。4.IS_ENABLED()与条件编译实验程序同时使用两种方式。4.1IS_ENABLED()printf(feature%s\n,IS_ENABLED(CONFIG_LEARN_FEATURE)?enabled:disabled);即使CONFIG_LEARN_FEATURE未定义IS_ENABLED()也能安全得到0。适合两条代码路径都能通过编译只是根据配置选择运行行为希望编译器做常量折叠。4.2 预处理条件#ifdefined(CONFIG_LEARN_FEATURE)printf(period_ms%d\n,CONFIG_LEARN_PERIOD_MS);#elseprintf(period_msnot compiled\n);#endif这里必须保护CONFIG_LEARN_PERIOD_MS因为 feature 关闭后其依赖不满足宏可能完全不存在。适合某个 API、类型或宏只在功能开启时存在希望相关代码完全不参与预处理后的编译条件控制头文件或结构定义。5. 第一次实验命令cd~/project/exportZEPHYR_SDK_INSTALL_DIR/home/yff/zephyr-sdk/zephyr-sdk-0.17.1sourcezephyr/zephyr-env.sh west build\-bnative_sim/native/64\/mnt/c/study/1-zephyr/labs/ch02_kconfig\--build-dir /mnt/c/study/1-zephyr/work/ch02_enabled\-palways west build\--build-dir /mnt/c/study/1-zephyr/work/ch02_enabled\-trun6. 必须检查的生成证据构建后执行rg^CONFIG_LEARN_\/mnt/c/study/1-zephyr/work/ch02_enabled/zephyr/.config rg^#define CONFIG_LEARN_\/mnt/c/study/1-zephyr/work/ch02_enabled/zephyr/include/generated/zephyr/autoconf.h观察两件事.config使用 Kconfig 表示法autoconf.h使用 C 宏表示法。6.1 本次实际结果程序输出*** Booting Zephyr OS build v4.1.0-rc1 *** greetingKconfig is active featureenabled period_ms250 verbose: period is provided by Kconfig.configCONFIG_LEARN_FEATUREy CONFIG_LEARN_PERIOD_MS250 CONFIG_LEARN_GREETINGKconfig is active CONFIG_LEARN_VERBOSEyautoconf.h#defineCONFIG_LEARN_FEATURE1#defineCONFIG_LEARN_PERIOD_MS250#defineCONFIG_LEARN_GREETINGKconfig is active#defineCONFIG_LEARN_VERBOSE1结论模拟确认。prj.conf中的有效请求经过 Kconfig 计算后进入.config再被转换为 C 预处理宏。7. 关闭主功能的对照实验disabled.confCONFIG_LEARN_FEATUREn CONFIG_LEARN_GREETINGfeature is disabled构建命令west build\-bnative_sim/native/64\/mnt/c/study/1-zephyr/labs/ch02_kconfig\--build-dir /mnt/c/study/1-zephyr/work/ch02_disabled\-palways\---DEXTRA_CONF_FILEdisabled.conf注意Zephyr 默认仍会先合并prj.conf再合并disabled.conf。后者覆盖前者请求的值。预期最终结果CONFIG_LEARN_FEATURE 不再以 y 出现在最终配置 CONFIG_LEARN_PERIOD_MS 不再生成 C 宏 CONFIG_LEARN_VERBOSE 不再生成 C 宏 CONFIG_LEARN_GREETING 变为 feature is disabled这证明依赖关闭不仅影响 menuconfig 的显示也影响最终符号和编译代码。8. 本节练习完成 enabled 实验后回答LEARN_PERIOD_MS的定义在哪里赋值请求在哪里最终可信值应该去哪个文件看为什么LEARN_FEATUREn时不能直接引用CONFIG_LEARN_PERIOD_MSIS_ENABLED(CONFIG_LEARN_FEATURE)与#ifdef CONFIG_LEARN_FEATURE的目的有什么差别9. 本章后续内容完成上述练习后继续depends on与 symbol 可见性select、imply与反向依赖default的优先级menuconfig实际操作Kconfig 如何控制 CMake 源码常见 warning未满足依赖、超出 range、符号未定义用 RT700 USS Kconfig 做一次只读配置追踪。