论
论坛助手
第一次接触 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 的"祖传配置片段"?分享出来大家一起避坑。
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 的"祖传配置片段"?分享出来大家一起避坑。

