
这次我们来看一个嵌入式开发绕不开的开源 RTOS——Zephyr。它不是一个只在招聘 JD 里出现的技术名词而是一整套面向复杂 MCU 产品的操作系统加构建生态。和裸机开发、FreeRTOS 相比Zephyr 最大的差异在于它把内核、驱动、协议栈和构建系统打包成一套可裁剪、可复用、偏产品级的框架。做 IoT 网关、BMS、可穿戴、带无线协议栈的控制器Zephyr 都是一个值得认真评估的选择。这篇算是一篇 Zephyr 专题梳理覆盖下面五个高频问题Zephyr 环境怎么搭建Kconfig 到底怎么配置Workbench for Zephyr 这类 IDE 值不值得用和 FreeRTOS 怎么选以及 Zephyr 的工程化流程到底长什么样。文章会带你把一条完整链路走通依赖安装、west 拉源码、Zephyr SDK 安装、hello_world 编译、QEMU 运行、Kconfig 裁剪最后落到 Zephyr vs FreeRTOS 的选型对比。整条链路只需要一台普通电脑不需要 GPU对显存没有任何要求。重点考察的是 Python、CMake、编译工具链和源码管理这些基础能力。适合正在做嵌入式项目选型、想从裸机或 FreeRTOS 迁移、或者在研究 Zephyr 环境搭建的开发者。下面直接进入主题。1. Zephyr 核心能力速览能力项说明项目类型开源实时操作系统RTOS开源组织Linux Foundation 旗下的 Zephyr Project系统架构微内核/单内核设计支持多线程、多核、MMU/MPU支持硬件架构ARM Cortex-M/R/A、x86、RISC-V、Xtensa、MIPS、SPARC 等构建系统west CMake Ninja配置系统Kconfig Devicetree内置能力内核对象、BLE、Wi-Fi、Thread、以太网、USB、文件系统、Shell 等开发环境Linux、Windows建议 WSL2、macOS调试方式west flash、QEMU、OpenOCD、SEGGER J-Link、RTT自动化能力west 命令行可脚本化适合 CI 批量构建许可证Apache 2.0可商用需要注意第三方组件许可资源占用取决于配置和目标板卡需按实际编译结果评估从材料看Zephyr 不是“轻量到极致”的 RTOS而是强调“可扩展、可裁剪、可复用”。它的核心价值在于用一套统一的构建和配置体系把不同 MCU、不同协议栈、不同驱动组合成同一个开发流程。这和我们平时用厂商 SDK 写裸机程序是两种完全不同的思路。2. Zephyr 适用场景与使用边界Zephyr 最适合的项目是那些“外设多、协议栈多、需要长期维护”的中大型嵌入式产品。典型场景包括需要 BLE、Wi-Fi、Thread、以太网等无线/有线连接的 IoT 设备。需要多个外设驱动同时工作比如传感器、显示、文件系统、USB 同时存在。需要在不同芯片平台之间复用业务逻辑减少厂商 SDK 绑定。需要 Shell 调试、日志系统、单元测试、低功耗管理等工程化能力。Zephyr 不适合的场景也很明显。如果你做的是 8 位单片机上的极简控制逻辑资源只有几 KB FlashZephyr 的内核开销和构建体系反而是负担。如果你的团队已经有一套成熟的 FreeRTOS 代码库并且产品短期内没有多协议栈、多平台迁移的需求硬切 Zephyr 不会带来多少收益。安全边界上需要注意Zephyr 是开源项目Apache 2.0 许可允许商用但集成第三方组件时比如某些网络协议栈或驱动代码要检查各自许可。涉及具体产品落地、不同国家和地区合规要求时需要由团队按产品定位自行确认。本文只讨论技术部署与验证流程。3. Zephyr 环境准备与前置条件3.1 开发环境选择Zephyr 官方支持 Linux、Windows 和 macOS。最省心的路径是 Linux 环境如果你是 Windows 用户建议直接使用 WSL2避免在原生 Windows 下处理串口、工具链和路径问题。前置条件大致如下Python 3.8 以上建议 3.10 或更高。CMake 3.20 以上Ninja 构建工具。git、wget、device-tree-compiler、gperf 等基础工具。磁盘空间预留 10 GB 以上Zephyr 源码、SDK 和构建产物都不算小。无需 GPU无需特殊显卡普通 PC 即可。3.2 Linux 依赖安装以 Ubuntu/Debian 系系统为例先安装基础依赖sudo apt update sudo apt install --no-install-recommends git cmake ninja-build gperf \ ccache dfu-util device-tree-compiler wget \ python3-dev python3-pip python3-setuptools python3-tk \ xz-utils file make gcc gcc-multilib如果你的发行版不同包名可能略有差异。安装完成后可以用cmake --version、ninja --version、python3 --version确认基本工具可用。3.3 安装 west 并拉取 Zephyr 源码Zephyr 的构建流程由 west 管理。west 是 Zephyr 项目提供的一个多仓库管理工具类似 Python 世界的包管理器但作用对象是多个 git 仓库。推荐先建一个 Python 虚拟环境避免把依赖装到系统 Python 里python3 -m venv ~/zephyrproject/.venv source ~/zephyrproject/.venv/bin/activate pip install west然后初始化 Zephyr 工作区cd ~/zephyrproject west init -m https://github.com/zephyrproject-rtos/zephyr.git west updatewest update会根据 manifest 文件拉取 Zephyr 主仓库以及相关的 hal、工具链描述等子仓库。这个过程取决于网络速度可能要等一段时间。拉取完成后安装 Zephyr 的 Python 依赖pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt之后每次打开终端都需要先激活虚拟环境再使用 westsource ~/zephyrproject/.venv/bin/activate3.4 安装 Zephyr SDK 与工具链Zephyr SDK 包含了编译目标架构所需的交叉编译器、调试器、QEMU 等工具。到 Zephyr SDK 的官方 releases 页面下载对应 Linux x86_64 的归档版本号以页面实际发布为准cd ~ # 下载对应版本归档这里用 VERSION 占位 wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/VERSION/zephyr-sdk-VERSION_linux-x86_64.tar.xz tar xf zephyr-sdk-VERSION_linux-x86_64.tar.xz cd zephyr-sdk-VERSION ./setup.sh安装完成后配置环境变量。建议把下面几行写入~/.bashrcexport ZEPHYR_TOOLCHAIN_VARIANTzephyr export ZEPHYR_SDK_INSTALL_DIR$HOME/zephyr-sdk-VERSION配置完成后执行source ~/.bashrc让环境变量生效。到这里Zephyr 环境搭建的基本步骤就完成了。4. 构建第一个 Zephyr 工程4.1 查看支持的板卡先确认 west 能正常工作并查看当前支持的开发板列表west boards输出会很长包含大量官方支持的开发板。如果你的板子不在列表里通常意味着需要自己编写板级支持文件这对新手来说成本较高。初次上手建议先用官方支持的开发板或 QEMU 模拟目标。4.2 编译 hello_world进入 Zephyr 主仓库目录编译 hello_world 示例目标板使用 QEMU 模拟的 Cortex-M3cd ~/zephyrproject/zephyr west build -b qemu_cortex_m3 samples/hello_world第一次构建会执行 CMake 配置和编译需要一段时间。构建成功后构建产物输出在build/目录下。看到Generating files... done和链接完成信息说明编译通过。4.3 在 QEMU 中运行不需要真正的开发板QEMU 可以先把系统跑起来west build -t run运行后终端会显示类似下面的输出*** Booting Zephyr OS build v3.x *** Hello World! qemu_cortex_m3看到Hello World!这一行说明 Zephyr 的编译、链接、启动链路已经全部打通。这是 Zephyr 验证流程中最先要做的一项测试。4.4 切换到真实开发板如果你手头有一块官方支持的开发板比如 STM32 系列的nucleo_f746zg可以换板名重新编译west build -b nucleo_f746zg samples/hello_world west flashwest flash会根据开发板的调试器自动调用对应烧录工具。不同开发板的调试器和烧录方式不同首次使用时要确认板卡驱动和调试器连接正常。5. Zephyr Kconfig 配置体系与 Workbench for Zephyr5.1 Kconfig 是什么Zephyr 的配置体系核心是 Kconfig。Kconfig 是 Linux 内核社区发展出来的配置系统Zephyr 沿用了这套思路。开发者通过CONFIG_XXX这种配置项决定哪些内核功能、驱动、协议栈被编译进固件。常见配置入口有三个prj.conf应用级别的配置放在应用目录下。board_defconfig开发板级别的默认配置放在板级目录下。menuconfig交互式配置界面可以动态修改配置项。举个例子打开串口 Shell在应用目录的prj.conf中加入CONFIG_SHELLy CONFIG_SHELL_BACKEND_SERIALy CONFIG_LOGy修改后重新执行west build配置会重新生成并编译。5.2 使用 menuconfig 查看和修改配置Kconfig 配置项很多手动编辑prj.conf容易漏。推荐用 menuconfig 查看配置依赖关系west build -t menuconfigmenuconfig 会打开一个文本交互界面。你可以搜索配置项、修改默认值、查看依赖。修改保存后重新执行west build即可生效。对于图形界面环境也可以使用west build -t guiconfig体验更直观。需要说明的是menuconfig 修改后的结果会写入构建目录不一定写回prj.conf。如果想要长期保存配置还是要把最终确定的CONFIG_XXX写回prj.conf保证源码可提交、可追溯。5.3 Workbench for Zephyr 的工作流Workbench for Zephyr 是面向 Zephyr 开发的商业化 IDE基于 Eclipse 生态。它把工程创建、环境配置、Kconfig 图形化编辑、Devicetree 查看、编译和调试整合在一起。对不想手敲 west 命令的开发者来说Workbench 可以降低 Zephyr 环境搭建的入门门槛。Workbench 的优势主要体现在三块提供可视化 Kconfig 编辑器能直接看到配置项之间的依赖关系。集成调试视图配合 J-Link、OpenOCD 可以断点调试 Zephyr 应用。提供项目模板和板卡支持向导减少手工配置的出错概率。但要注意Workbench 不是 Zephyr 编译的必要条件。它本质上是把 west、CMake、Ninja、调试器这些底层工具包了一层界面。你自己用命令行一样能完成全部操作。是否选用 Workbench取决于团队是否愿意为开发体验付费以及是否熟悉 Eclipse 系 IDE。5.4 VSCode 等其他开发方式如果你不想引入商业 IDEVSCode 配合 Zephyr 扩展也是一种常见方案。社区维护的 zephyr-rtos 扩展支持语法高亮、构建任务、板卡选择、调试配置。配合 west 的命令行基本上能做到和 Workbench 相近的开发体验。实际项目里我见过很多团队是“命令行构建 VSCode 写代码 厂商调试器”的组合。Zephyr 的扩展点足够开放IDE 不是决定性因素。6. Zephyr 功能测试与效果验证Zephyr 的测试思路和普通 Linux 应用不同。它没有一个你在 PC 上双击运行的 GUI 程序验证目标通常是串口日志、Shell 交互、外设行为、构建产物大小。下面按优先级给出测试维度。6.1 基础启动验证测试目的确认编译产物能够在目标平台启动内核初始化正常主函数执行。使用 QEMU 或者真实开发板运行 hello_world观察串口输出。判断成功标准是看到Hello World!和板卡名。如果没有任何输出优先检查串口终端配置、波特率、日志等级和构建是否包含CONFIG_SERIAL。6.2 Shell 交互验证测试目的确认 Zephyr Shell 能接收和响应命令用于后续在线调试。在prj.conf中开启 Shell 后重新编译运行进入 Shell输入help应该输出一组可用命令。再输入kernel version可以看到内核版本信息。如果 Shell 没有输出检查是否选错了串口后端或者终端软件是否发送了换行符。6.3 硬件外设验证测试目的确认 GPIO、UART、I2C、SPI 等外设驱动在真实板卡上正常工作。以 GPIO 为例编译samples/basic/blinky开发板上的 LED 应该开始闪烁。这个示例是关键路径测试表明板级 Devicetree、GPIO 驱动、时钟配置都正确。如果 LED 不亮排查顺序通常是板卡型号是否选对、LED 引脚在 Devicetree 中的定义是否匹配、GPIO 驱动是否使能。6.4 判断成功与常见失败现象判断维度成功表现常见失败现象编译链接完成无报错报错找不到头文件、Flash 超限、链接器脚本问题启动串口输出启动日志无输出卡死不动反复重启Shellhelp 命令有响应输入不显示、命令无回显外设LED 闪烁、传感器读数正常引脚无输出、设备返回错误烧录flash 成功板卡运行调试器连接失败、目标板供电不足遇到问题不要先怀疑 Zephyr 内核多数失败出现在板级配置、工具链路径和串口终端这三类问题上。7. 自动化与批量构建7.1 west build 常用命令Zephyr 的自动化能力依赖 west 命令。记录几个高频命令# 指定开发板构建 west build -b qemu_cortex_m3 samples/hello_world # 指定构建目录避免不同板卡互相覆盖 west build -b qemu_cortex_m3 samples/hello_world -d build_qemu # 清理构建产物 west build -t clean # 打印构建命令 west build --verbose # 查看所有可执行 target west build -t help实际项目中建议每个板卡使用独立构建目录避免反复切换板名导致构建缓存混乱。7.2 批量构建多个板卡Zephyr 的交付物通常要覆盖多个硬件平台。批量构建可以写成脚本逐个板卡编译并输出日志#!/usr/bin/env bash set -euo pipefail BOARDSqemu_cortex_m3 qemu_x86 nucleo_f746zg for board in $BOARDS; do echo Building $board west build -b $board samples/hello_world -d build_$board done这样既能验证代码在多个平台上的可移植性也能在提交代码后快速发现某个板卡特有的编译错误。配合 Jenkins、GitLab CI 或 GitHub Action可以把这段脚本挂到每次 push 之后执行。7.3 接入 CI 的建议一个可用的 Zephyr CI 流水线至少包含三个阶段初始化环境、拉取依赖、批量构建。CI 机器上同样需要安装 Zephyr SDK 和 Python 虚拟环境。注意在 CI 中固定 manifest 版本避免west update拉到未验证的提交导致构建结果不稳定。8. 资源占用与性能观察8.1 从编译输出看 ROM/RAMZephyr 每次编译结束后终端会输出该板卡的 ROM 和 RAM 占用Memory region Used Size Region Size %age Used FLASH: 24576 B 1 MB 2.34% RAM: 4096 B 256 KB 1.56%这个数字是评估“这个配置是否适合目标芯片”的最直接依据。不同板卡、不同 Kconfig 配置数字差异非常大。同一块板卡Bare minimum 配置和完整网络协议栈配置可能差出几十 KB Flash。所以不要拿别人博客里的数字直接对号入座要以自己的构建输出为准。8.2 使用报表查看详细占用west 还提供专门的内存报告 targetwest build -t ram_report west build -t rom_report west build -t footprintram_report和rom_report会生成详细的内存占用表格能按模块查看每个功能占了多少 Flash、多少 RAM。这比看编译输出末尾的汇总数字更有用尤其是做裁剪优化时。footprinttarget 则可以对比多个配置的占用差异。8.3 按需裁剪配置Zephyr 的系统开销不是固定值而是由配置项决定的。裁剪思路可以从这几个方面入手关闭不需要的驱动和协议栈减少 Flash 占用。调整日志等级CONFIG_LOG_DEFAULT_LEVEL从 INFO 降到 WARNING 或 OFF。降低线程栈大小但需要评估栈溢出风险。去掉 Shell、文件系统等调试功能减小 RAM 和 Flash 占用。使用优化等级-Os换取更小体积。每次裁剪后重新运行ram_report和rom_report观察哪些模块占用下降。这个“裁剪 - 报告 - 再裁剪”的循环是 Zephyr 工程优化的基本节奏。8.4 性能观察的边界Zephyr 不像 Linux 那样有完整的 top、perf 工具内核通常也不带 CPU 利用率统计。做性能评估时可以借助 Shell 的kernel threads命令查看线程运行数和栈使用率也可以外接逻辑分析仪测量 GPIO 翻转时间。如果材料中没有具体数据不要轻易断言某个板卡的确定性延迟是多少一切以实际测量为准。9. Zephyr vs FreeRTOS嵌入式项目选型对比很多开发者纠结选 Zephyr 还是 FreeRTOS。这里给出一个偏工程视角的对比具体版本和特性以官方最新发布为准。对比维度ZephyrFreeRTOS项目治理Linux 基金会主导Amazon Web Services 维护构建系统west CMake Ninja官方 CMake 支持但更灵活、更随意配置系统Kconfig Devicetree以头文件和宏定义为主内置协议栈内置 BLE、Wi-Fi、Thread、以太网等协议栈通常来自厂商或第三方学习曲线较陡需要理解 Kconfig、Devicetree、west平滑适合从裸机过渡硬件适配官方板卡支持多但新板卡适配成本高厂商 SDK 集成度高上手快长期维护能力统一构建和配置适合多产品线复用看团队规范灵活但容易碎片化典型场景复杂 IoT、多协议、多外设、多平台简单控制、单芯片、快速交付选型时不要只看实时性这种比较空泛的指标要看团队和产品实际约束。如果产品线单一、资源极度受限、交付周期短、团队不熟悉 CMakeFreeRTOS 是更安全的选择。它能让你用最熟悉的姿势快速完成开发。如果产品要覆盖多种芯片、需要 BLE/Wi-Fi/Thread 多协议、希望用统一工程体系管理多个项目Zephyr 的长期价值更大。虽然初期学习成本高但换来的是跨平台复用和更完整的软件生态。站在 2026 年的选型视角看Zephyr 在物联网、车用网关、边缘计算控制器的比重还在上升。FreeRTOS 在简单 RTOS 场景依然稳固。两个系统不是“谁取代谁”而是“不同资源约束下的工程选择”。10. 常见问题与排查方法问题现象可能原因排查方式解决方案west 命令找不到虚拟环境未激活检查which west重新激活.venvwest update 一直失败网络不稳定或仓库较大查看错误日志、重试检查网络按官方文档调整源构建提示找不到 Python 依赖依赖未安装pip install -r requirements.txt重装 requirements构建提示找不到 Zephyr SDK环境变量未设置检查ZEPHYR_SDK_INSTALL_DIR配置~/.bashrc并 sourceflash 烧录失败调试器驱动或端口占用检查开发板连接、调试器端口关闭占用端口或调整调试器配置串口无输出串口配置或日志等级检查终端波特率、CONFIG_LOG调整prj.conf或终端配置Flash 超限配置功能过多查看 rom_report裁剪驱动、协议栈、日志QEMU 运行无显示用错 target确认是否使用-t run在终端查看输出不用图形板卡不在 west boards 列表板级支持缺失检查官方 board 目录选择官方板卡或自行编写板级配置最容易被忽略的是 west 命令必须在虚拟环境里执行。每次打开新终端第一件事就是source ~/zephyrproject/.venv/bin/activate否则会出现 west 命令版本混乱或找不到模块的问题。11. 最佳实践与使用建议Zephyr 项目工程化建议从第一条开始执行能省掉后面大量排错时间。第一统一 Python 环境。使用 venv 隔离 west 和 Zephyr 依赖不要依赖系统 Python。系统 Python 升级、pip 版本变化都可能悄悄破坏 Zephyr 构建链。第二固定 manifest 版本。west update拉取的是 manifest 中锁定的提交但如果你自己改动过 manifest或者使用处于移动中的开发分支构建结果会变得不可控。建议以官方发布标签或 LTS 版本为基线每次升级显式更新。第三目录规范。按项目类型拆分app/、board/、drivers/、modules/。Zephyr 的构建系统支持模块化扩展把业务代码放到独立的 application 目录里而不是直接修改 Zephyr 主仓库避免后续升级源码时冲突。第四坚持先小规模验证再放大。初次接触 Zephyr不要一开始就大改 Kconfig。先跑通 hello_world、Shell、LED 闪烁再逐步加入传感器、网络、文件系统每加一个模块就编译一次并观察 Flash/RAM 变化。第五重视许可证检查。Apache 2.0 不等于所有依赖都是 Apache 2.0。使用第三方模块或驱动时确认其许可证是否和你的商用模式冲突。涉及具体产品发布建议由法务或合规人员参与确认。第六善用日志而不是盲调。Zephyr 的日志系统很完善遇到驱动异常先打开对应模块的调试日志比如CONFIG_GPIO_LOG_LEVEL_DBG观察初始化流程到底卡在哪一步。比反复改代码重编译更高效。12. 总结与下一步Zephyr 值得上手的第一理由是它用一套构建和配置体系把嵌入式开发从“板卡厂商 SDK 零散 demo”拉回到“产品级工程管理”。west 管理多仓库Kconfig 裁剪功能Devicetree 描述硬件Shell 在线调试这套组合是现代嵌入式开发比较完整的工作流。建议按照这个顺序做验证先搭环境再跑 QEMU hello_world然后开 Shell之后编译 blinky 到真实板卡最后尝试裁剪配置观察 ROM/RAM 变化。这个流程能让你在一天之内对 Zephyr 有一个比较完整的体感。最容易踩的坑有两个一是 west 和 Zephyr SDK 环境变量没有配置好构建时报一堆找不到工具链的错误二是把 Zephyr 当成普通 MCU SDK一上来就全功能开启结果 Flash 超限。先从最小配置起步再逐步往上加功能很多问题都不会出现。后续可以继续研究的方向包括Devicetree 的板级适配、Zephyr 网络协议栈的裁剪、BLE 应用开发、以及持续集成里多板卡批量构建。如果你正在做 2026 年嵌入式项目选型建议把 Zephyr 加入调研清单用官方支持的开发板跑一个真实原型再做最终决定。建议收藏备用部署遇到问题时回查第 3 节和第 10 节。