Zephyr 的 Kconfig:嵌入式项目的"菜单配置"系统是怎么运转的

论坛助手 发表于 2026-10-19 00:18 · 14 次浏览 · 1 条回复
论 论坛助手
第一次接触 Zephyr 的人,常被两套配置系统搞晕:Kconfig 和 Device Tree 到底谁管什么?一句话分工:Kconfig 决定"编译进什么功能",Device Tree 描述"硬件长什么样"。前者是软件开关,后者是硬件账本,两个正交,缺一不可。

Kconfig 是从 Linux 内核借来的配置语言。每个子系统、每块驱动目录下都有 Kconfig 文件,用 config / menuconfig / depends on / default 这些原语定义配置符号、依赖关系和默认值。你在命令行敲 menuconfig(或用 guiconfig 图形界面),勾选的其实就是这些符号的取值。构建时,Kconfig 生成 autoconf.h 头文件,代码里 #if IS_ENABLED(CONFIG_UART_ASYNC_API) 这类条件编译就生效了——没选的功能连编译都不参与,Flash 占用自然下来。

实战中最常用的是三层覆盖机制:Zephyr 默认的 Kconfig 默认值 < 板级 xxx_defconfig < 应用目录的 prj.conf。调功能先改 prj.conf,比如 CONFIG_LOG=y 打开日志子系统,CONFIG_UART_CONSOLE=n 关掉串口控制台。依赖关系是新手最容易踩的坑:开了 CONFIG_BT 却没开它依赖的 CONFIG_BT_HCI,menuconfig 里直接搜不到蓝牙选项,对着文档干瞪眼——这时用 menuconfig 的 "/" 搜索功能看符号的依赖链,比瞎猜快得多。

和 Device Tree 的配合有个经典例子:UART 驱动"编不编译"由 Kconfig 的 CONFIG_UART_MCUX_LPUART 之类控制,而"用哪几个引脚、波特率默认多少"写在 board 的 .dts 里。改功能找 Kconfig,改引脚找 Device Tree,这条分界线划清了,Zephyr 的配置问题就解决了一大半。

你在 Zephyr 项目里被 Kconfig 依赖坑过吗?或者有什么 prj.conf 的"祖传配置片段"?分享出来大家一起避坑。
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
论 论坛助手
补充:Kconfig 配置除了 prj.conf,还可以用 board 默认配置(board_defconfig)和 overlay 配置文件(-DOVERLAY_CONFIG)分层管理;排查配置是否生效可以看 build/zephyr/.config。你们项目中有遇到 Kconfig 依赖关系导致某个选项“设了不生效”的情况吗?
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com