)
本文是「Zephyr 内核从入门到精通」系列第 03 篇。上一篇讲了架构这一篇把开发环境从零装好并亲手点亮第一颗 LED。每一条命令都标清楚在哪个目录、敲哪条命令、应该看到什么输出照着抄就能跑通。没有开发板也没关系文末有 QEMU 仿真方案。建议先点赞收藏开一个终端窗口跟着做不踩坑。目录一、先搞懂Zephyr 开发环境的组成二、动手前的准备必读三、Linux / macOS 搭建步骤逐条带预期输出四、Windows 搭建步骤逐条带预期输出五、编译并点亮第一个 blinky含自建最小工程六、没有开发板用 QEMU 仿真跑通七、west 核心命令速查八、高频报错排查表加强版14 条九、总结一、先搞懂Zephyr 开发环境的组成很多人搭环境失败是因为不知道自己在装什么报错了无从下手。先看这张图建立全局认知Zephyr 环境分两大块你装的所有东西都能归到这两类里① Host 工具运行在你这台电脑上Python 3 venvwest 是 Python 写的构建脚本也依赖它。venv是 Python 的「虚拟环境」相当于给 Zephyr 单独开一个干净的小房间不污染系统 Python。WestZephyr 官方的「元工具」meta-tool既能管理十几个 Git 仓库又封装了build/flash/debug等命令。你可以把它理解成 Zephyr 世界的「总指挥」。CMake≥ 3.20构建系统生成器把工程描述翻译成实际的编译指令。Ninja真正执行编译的高速引擎比传统 make 快很多。Git用来拉取 Zephyr 主仓库及其几十个 modules外设驱动、HAL、第三方库等。② Zephyr SDK交叉编译工具链给目标 MCU 用的编译器如arm-zephyr-eabi-gcc OpenOCD 等烧录调试工具。关键理解你电脑上的 gcc 是给 PC 编译程序的SDK 里的 gcc 是给单片机编译程序的。两套编译器分工不同互不替代。这就是「交叉编译」——在 A 平台上编译出 B 平台能跑的程序。记住这个分层后面排错时只要先判断「问题出在 Host 工具 / 源码网络 / SDK 硬件 哪一层」就能少走 90% 弯路。二、动手前的准备必读正式开始前先确认三件事能帮你省下大量回头返工的时间。1确认 Python 和 CMake 版本达标打开终端Windows 用 PowerShell分别敲python3--versioncmake--version预期输出版本号 ≥ 要求即可Python 3.11.6 cmake version 3.27.7Python 必须≥ 3.10CMake 必须≥ 3.20。低于这个版本后面west build会直接报错。如果命令提示「找不到」说明还没装或没加进 PATH先在第三/四节里把依赖装上。2准备好网络国内重点west update要从 GitHub 拉十几个仓库几百 MB 起步。国内网络很容易卡死或超时强烈建议提前挂好代理否则会卡在这一步反复失败。3规划目录我们统一把工程放在用户主目录下的zephyrproject文件夹。整个搭建流程如下图建议照着这个顺序走下面分平台讲。Linux/macOS 看第三节Windows 看第四节按需跳转即可。三、Linux / macOS 搭建步骤逐条带预期输出3.1 安装系统依赖操作位置任意终端目录无所谓。Ubuntu / Debiansudoaptupdatesudoaptinstall--no-install-recommends\gitcmake ninja-build gperf ccache dfu-util device-tree-compiler\python3-dev python3-pip python3-venv python3-tkwgetxz-utilsfile这一步在做什么装齐 Host 工具git、cmake、ninja 等和一些编译期会用到的小工具。--no-install-recommends表示只装必需包不装一堆推荐附属包。macOS用 Homebrewbrewinstallcmake ninja gperf python3 ccache qemu dtcgit预期输出一长串下载/安装日志最后没有error字样即成功。装完用第二节的命令复查一下 cmake / python 版本是否达标。3.2 创建虚拟环境并安装 west操作位置任意终端。这一步会在~/zephyrproject下建一个.venv目录。python3-mvenv ~/zephyrproject/.venvsource~/zephyrproject/.venv/bin/activate pipinstallwest逐条拆解第 1 行在~/zephyrproject/.venv创建虚拟环境那个干净的「小房间」。第 2 行source ... activate是「进入小房间」。成功后你的命令行提示符前面会多出一个(.venv)前缀。第 3 行在房间里装 west。预期输出关键看最后一行(.venv) Successfully installed west-1.2.0⚠️ 划重点之后每次开新终端都要先执行source ~/zephyrproject/.venv/bin/activate否则west命令会提示找不到。看到提示符没有(.venv)前缀就说明忘激活了。这是新手最高频的「假报错」。验证 west 装好了west--version预期输出West version: v1.2.03.3 获取 Zephyr 源码操作位置终端确保已激活 venv提示符有(.venv)。west init ~/zephyrprojectcd~/zephyrproject west update逐条拆解west init初始化工作区会创建.west/配置目录并下载主清单仓库。这一步很快。cd ~/zephyrproject进入工作区目录。后续 west 命令都在这里或其子目录里执行。west update按清单拉取所有 modules十几个仓库。这一步最慢、最吃网络。west update预期输出会滚动很久 updating hal_nordic (modules/hal/nordic): --- hal_nordic: initializing Receiving objects: 100% (12345/12345), 45.67 MiB | 2.10 MiB/s, done. updating cmsis (modules/hal/cmsis): ... updating zephyr ...看到一个个 updating xxx滚过去最后回到命令行提示符且无error就成功了。国内卡在这里很常见。如果某个仓库反复超时先确认代理生效再重新执行west update它支持断点续传已下好的不会重下。3.4 安装 Python 依赖操作位置~/zephyrproject目录venv 已激活。west packages pip--install这一步在做什么Zephyr 的构建/测试脚本依赖一批 Python 包如pyelftools、pykwalify等这条命令一次性把它们装进当前 venv。预期输出Collecting pyelftools0.29 ... Successfully installed pyelftools-0.31 pykwalify-1.8.0 ...3.5 安装 Zephyr SDK交叉编译工具链操作位置~/zephyrproject目录venv 已激活。west sdkinstall这一步在做什么自动下载并安装与当前 Zephyr 版本匹配的 SDK给单片机用的交叉编译器 OpenOCD 等。SDK 体积较大12 GB耐心等。预期输出Installing SDK 0.16.x to /home/you/zephyr-sdk-0.16.x Downloading ... 100% Verifying SHA256 ... OK Successfully installed Zephyr SDK若网络受限下载失败可去 GitHub 的zephyr-sdkReleases 页手动下载压缩包解压后运行包内的setup.sh注册即可效果等价。至此Linux/macOS 环境搭建完成。下面 Windows 用户看第四节已完成的可直接跳到第五节点灯。四、Windows 搭建步骤逐条带预期输出Windows 的思路与 Linux 完全一致区别只在「依赖怎么装」和「venv 怎么激活」。全程用PowerShell建议以管理员身份打开。4.1 安装依赖推荐 Chocolatey操作位置管理员 PowerShell。先安装 Chocolatey去官网复制那条安装命令执行然后choco install cmake ninja gperf python git wget unzip dtc-msys2-y这一步在做什么用包管理器一次装齐所有 Host 工具。-y表示全部自动确认。预期输出结尾出现类似字样即成功Chocolatey installed 8/8 packages.不想用 Chocolatey 也行可以用winget逐个装winget install Kitware.CMake、winget install Ninja-build.Ninja、winget install Python.Python.3.11、winget install Git.Git。装完关闭并重开一个 PowerShell让 PATH 生效用第二节命令复查python --version/cmake --version是否达标。4.2 创建虚拟环境 安装 west操作位置PowerShell会在%USERPROFILE%\zephyrproject下建.venv。python-m venv$HOME\zephyrproject\.venv$HOME\zephyrproject\.venv\Scripts\Activate.ps1 pip install west预期输出激活成功后提示符前面会出现(.venv)最后一行(.venv) Successfully installed west-1.2.0如果第 2 行报错「无法加载文件 … 因为在此系统上禁止运行脚本」先执行下面这条放开 PowerShell 脚本权限再重试激活Set-ExecutionPolicy-ExecutionPolicy RemoteSigned-Scope CurrentUser同样Windows 上每次开新 PowerShell 也要先跑一遍Activate.ps1才能用 west。4.3 拉源码 装依赖 装 SDK操作位置PowerShellvenv 已激活。west init$HOME\zephyrproject cd$HOME\zephyrproject west update west packages pip--install west sdk install含义与 Linux 第 3.33.5 节完全相同预期输出也一致 updating xxx滚屏、Successfully installed、Successfully installed Zephyr SDK。Windows 烧录真实硬件还需安装调试器驱动ST-Link / J-Link。如果烧录时识别不到设备用Zadig给对应 USB 设备安装 WinUSB 驱动即可。五、编译并点亮第一个 blinky环境装好了现在来点灯。先用官方现成例子再给你一份「自己从零搭的最小工程」两种都讲。5.1 方案 A直接用官方 samples/basic/blinky操作位置~/zephyrproject/zephyr目录Windows 为$HOME\zephyrproject\zephyrvenv 已激活。cd~/zephyrproject/zephyr west build-bnrf52840dk/nrf52840 samples/basic/blinky west flash逐条拆解cd ... /zephyr进入 Zephyr 主仓目录官方 samples 就在这下面。west build -b board app路径编译。-b后面是板子标识samples/basic/blinky是要编译的工程路径。west flash把编译产物烧进开发板。关于板名重点新版 Zephyr 采用Hardware Model v2板名带斜杠格式是板子/SoC[/核]。常见例子Nordicnrf52840dk/nrf52840ESP32esp32_devkitc_wroom/esp32/procpuSTnucleo_f401re不确定自己板子叫什么用下面命令查以 nrf52840 为例west boards|grepnrf52840west build预期输出重点看结尾的 Memory region 用量-- west build: building application [1/150] Preparing syscall dependency handling ... [150/150] Linking C executable zephyr/zephyr.elf Memory region Used Size Region Size %age Used FLASH: 24576 B 1 MB 2.34% RAM: 4096 B 256 KB 1.56% IDT_LIST: 0 GB 32 KB 0.00%看到Memory region这张表 没有error就代表编译成功产物在build/zephyr/zephyr.elf及.hex、.bin。west flash预期输出-- west flash: using runner nrfjprog Flashing build/zephyr/zephyr.hex Programming ... OK Verifying ... OK -- runner nrfjprog: Board with serial number xxxxxx flashed successfully.看到flashed successfully去看开发板——板载 LED 开始一秒一闪点灯成功5.2 方案 B自己从零搭一个最小 blinky 工程理解工程结构比直接抄例子更重要。一个最小 Zephyr 应用只需要3 个文件my_blinky/ ├── CMakeLists.txt ← 告诉构建系统源文件是哪些 ├── prj.conf ← 应用级配置开哪些功能 └── src/ └── main.c ← 你的业务代码操作位置在~/zephyrproject下新建my_blinky目录。CMakeLists.txtcmake_minimum_required(VERSION 3.20.0) find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(my_blinky) target_sources(app PRIVATE src/main.c)说明find_package(Zephyr ...)把整个 Zephyr 构建系统拉进来target_sources(app ...)声明你的源文件。app是 Zephyr 约定的目标名照写即可。prj.confCONFIG_GPIOy说明blinky 要操作 GPIO所以开启CONFIG_GPIO。prj.conf就是「功能开关清单」需要什么子系统就在这里打开。src/main.c#includezephyr/kernel.h#includezephyr/drivers/gpio.h/* 从设备树取板载 LED别名 led0具体引脚由设备树决定代码不用关心引脚号 */#defineLED0_NODEDT_ALIAS(led0)staticconststructgpio_dt_specledGPIO_DT_SPEC_GET(LED0_NODE,gpios);#defineSLEEP_TIME_MS1000intmain(void){if(!gpio_is_ready_dt(led)){return0;}/* 配置为输出初始电平为「点亮」 */gpio_pin_configure_dt(led,GPIO_OUTPUT_ACTIVE);while(1){gpio_pin_toggle_dt(led);/* 翻转电平亮-灭-亮... */k_msleep(SLEEP_TIME_MS);/* 睡 1 秒 */}return0;}注意看代码里没有任何引脚号全靠设备树的led0别名。「它怎么知道点哪颗灯」——这正是下一篇《设备树》要讲的核心先埋个伏笔。编译并烧录自建工程操作位置~/zephyrproject目录venv 已激活。cd~/zephyrproject west build-bnrf52840dk/nrf52840 my_blinky west flash预期输出与方案 A 一样先看到Memory region用量表再看到flashed successfullyLED 开始闪烁。 改了prj.conf或加了设备树 overlay 后一定要用全新构建否则旧缓存会让你的改动「不生效」west build-palways-bnrf52840dk/nrf52840 my_blinky-p always表示 pristine每次都从零干净构建。新手遇到「我明明改了配置怎么没反应」九成是忘了加-p always。5.3 看 LED 闪烁日志可选如果想在串口看日志给prj.conf加上CONFIG_GPIOy CONFIG_LOGy并在代码里用LOG_INF(LED state: %d, val);打印。连好串口115200 8N1后用串口工具能看到类似*** Booting Zephyr OS build v3.x.x *** [00:00:01.000] inf main: LED state: 1 [00:00:02.000] inf main: LED state: 0 [00:00:03.000] inf main: LED state: 1每秒一行、状态在 0/1 之间翻转和 LED 的明灭节奏一致。六、没有开发板用 QEMU 仿真跑通没有硬件也能学。QEMU 能仿真一块 Cortex-M3 板子让你在纯软件里把整条工具链跑通。操作位置~/zephyrproject/zephyr目录venv 已激活。先跑个最稳的 hello_world 验证工具链cd~/zephyrproject/zephyr west build-bqemu_cortex_m3 samples/hello_world west build-trun逐条拆解-b qemu_cortex_m3目标板换成 QEMU 仿真板。west build -t run-t run是「构建并在 QEMU 里直接运行」的目标。预期输出直接在终端打印-- west build: running target run *** Booting Zephyr OS build v3.x.x *** Hello World! qemu_cortex_m3看到Hello World!说明Host 工具 SDK 这条链路完全打通。按Ctrl A然后按X退出 QEMU。新手强烈建议先用 QEMU 把流程跑顺再上真实硬件。这样一旦真机出问题你能确定「不是环境的锅」排错范围立刻缩小一半。七、west 核心命令速查# 构建首次 / 常规west build-bboardapp_path# 全新构建改了 prj.conf / overlay 后必加 -p alwayswest build-palways-bboardapp_path# 图形化配置west build-tmenuconfig# 文本菜单west build-tguiconfig# 图形窗口# QEMU 里直接运行west build-trun# 烧录 / 调试west flash west debug# 查板子 / 更新源码west boards west update八、高频报错排查表加强版14 条#报错现象根本原因解决办法1west: command not found/无法将west识别为...没激活 venv提示符没有(.venv)Linux/macsource ~/zephyrproject/.venv/bin/activateWin.venv\Scripts\Activate.ps12PowerShell 报「禁止运行脚本」激活失败执行策略限制Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser后重试3west update卡死 / 反复超时拉 GitHub 网络问题挂代理后重跑支持断点续传或换镜像源4CMake 3.x or higher is required. You are running 3.16CMake 版本 3.20升级 CMake再cmake --version复查5Python 3.10 required或包装不上Python 3.10 或没用 venv升级 Python务必在 venv 内west packages pip --install6改了prj.conf/ overlay 但「不生效」CMake 缓存未刷新用全新构建west build -p always -b board app7Board xxx not found用了旧板名写法无斜杠改 HW Model v2 斜杠格式如nrf52840dk/nrf52840west boards查准确名8west sdk install下载失败 / 校验不过网络中断或文件损坏重跑或去 GitHub Releases 手动下zephyr-sdk解压后跑setup.sh9flash提示找不到设备 /No device foundUSB 驱动或权限问题Linux 装 udev 规则并重新插拔Windows 用 Zadig 装 WinUSB 驱动10pip install报包冲突 / 依赖打架污染了系统 Python没用 venv删掉旧环境重建 venv全部操作在 venv 内做11ZEPHYR_BASE相关报错 /find_package(Zephyr)失败没在工作区内执行 / 环境变量缺失在~/zephyrproject下执行必要时source zephyr/zephyr-env.sh12error: led0 undeclared/ 设备树别名找不到该板没有led0别名换有 LED 别名的板或自己写 overlay 补aliases { led0 ...; }下一篇讲13west build报Ninja not foundNinja 没装或没进 PATH重装 Ninja重开终端让 PATH 生效14QEMU 卡住不动 / 退不出来不知道退出快捷键退出 QEMU先按Ctrl A松手再按X排错心法先判断报错属于Host 工具 / 源码网络 / SDK 硬件哪一层再针对性处理比盲目复制报错去搜高效得多。表里第 1、3、6、7、9 条占了新手 90% 的坑遇事先看这几条。九、总结Zephyr 环境 Host 工具含 West Zephyr SDK分层理解是排错的前提务必用 venv隔离 Python避免依赖冲突记住每开新终端都要先激活标准六步系统依赖 → 建 venv 装 west →west init/update→west packages pip --install→west sdk install→ 编译点灯最小工程只要CMakeLists.txt prj.conf src/main.c三个文件改配置后记得-p always全新构建没硬件用QEMU 仿真照样学90% 报错集中在没激活 venv、网络、没 pristine 重建、USB 驱动、板名写法。下一篇《Zephyr 设备树Devicetree》揭开本篇埋的伏笔blinky 代码里没有引脚号它怎么知道该点哪颗灯答案就在设备树。如果帮到你点赞 收藏 关注三连支持是我持续更新的动力。搭环境遇到的报错欢迎贴在评论区我帮你定位。