2、开发环境搭建:安装Zephyr SDK、west工具、依赖包,配置VS Code或命令行环境,验证Hello World
Zephyr RTOS 的开发和传统嵌入式开发(如 Keil、IAR + STM32CubeMX)有本质区别:它采用“源码树 + 构建系统 + 工具链”的模块化设计,所有构建动作通过 west 命令驱动,而编译链接则由 CMake 和 Ninja 在后台完成。搭建一套干净、可复现的开发环境,是后续所有实验和项目开发的基础。本章将带你从零开始,完成 Zephyr SDK、west 工具、系统依赖包的安装,并配置 VS Code 或纯命令行环境,最终编译并烧录 Hello World 示例到开发板上。
2.1 核心原理:west 与 Zephyr SDK 的分工
Zephyr 的构建体系可以概括为“一个调度器 + 一个编译器集合”。west(Zephyr’s meta-tool)是 Zephyr 项目的多仓库管理工具,它负责拉取 Zephyr 主仓库、模块仓库(如 HAL、加密库、文件系统)以及应用仓库,并统一调度构建命令。Zephyr SDK 则是一套预编译的交叉编译工具链,包含 GCC 编译器、GDB 调试器、Newlib 库以及 QEMU 模拟器,它针对 Zephyr 支持的多种架构(ARM、RISC-V、x86、Xtensa)提供了开箱即用的支持。
两者的关系可以类比为:west 是“项目经理”,负责协调所有代码仓库的版本和依赖;SDK 是“施工队”,提供具体的编译、链接和调试工具。在构建过程中,CMake 读取 CMakeLists.txt 和 prj.conf 配置,生成 Ninja 构建脚本,Ninja 再调用 SDK 中的交叉编译器生成目标固件。理解这一链路,有助于后续排查环境变量、工具链版本不匹配等问题。
| 组件 | 作用 | 典型安装位置 | 版本管理方式 |
|---|---|---|---|
| west | 多仓库管理、构建/烧录命令入口 | ~/.local/bin/west | pip 管理,随 Zephyr 版本更新 |
| Zephyr SDK | 交叉编译工具链、QEMU、调试器 | ~/zephyr-sdk-0.16.x/ | 独立压缩包,需手动配置环境变量 |
| Zephyr 源码树 | 内核、驱动、子系统、HAL 源码 | ~/zephyrproject/zephyr/ | west init + west update 管理 |
| 系统依赖包 | CMake、Ninja、gperf、dtc 等构建工具 | /usr/bin/ | apt/brew 管理 |
2.2 操作流程:从零搭建完整环境
以下流程以 Ubuntu 22.04 LTS 为例(macOS 用户只需将 apt 替换为 brew,路径略有差异)。请确保你的网络可以访问 GitHub 和 PyPI。
步骤 1:安装系统依赖包
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 g++-multilib libsdl2-dev
其中 dfu-util 用于后续通过 USB DFU 协议烧录固件,device-tree-compiler(dtc)用于编译设备树源文件,libsdl2-dev 是 QEMU 图形显示所需的库。
步骤 2:安装 west 工具
pip3 install --user west
export PATH=~/.local/bin:$PATH
验证安装:west --version,如果输出类似 West version: v1.2.0 则成功。建议将 export PATH=~/.local/bin:$PATH 写入 ~/.bashrc 以便持久生效。
步骤 3:获取 Zephyr 源码树
mkdir ~/zephyrproject && cd ~/zephyrproject
west init -m https://github.com/zephyrproject-rtos/zephyr --mr v3.7.0
west update
west init 会创建一个 .west/config 配置文件并拉取主仓库;west update 则根据 manifest 文件拉取所有模块(如 modules/hal/stm32、modules/lib/cmsis 等)。这一步耗时较长,取决于网络状况。
步骤 4:安装 Zephyr SDK
cd ~
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.8/zephyr-sdk-0.16.8_linux-x86_64.tar.xz
tar xf zephyr-sdk-0.16.8_linux-x86_64.tar.xz
cd zephyr-sdk-0.16.8
./setup.sh -t all -h -c
setup.sh 脚本会自动将 SDK 路径写入 ~/.zephyrrc 文件,并安装 udev 规则(用于开发板 USB 识别)。安装完成后,执行 source ~/.zephyrrc 或重新登录终端使环境变量生效。
步骤 5:安装 Python 依赖
pip3 install --user -r ~/zephyrproject/zephyr/scripts/requirements.txt
这一步会安装 pyelftools、pykwalify、canopen 等 Zephyr 构建和测试所需的 Python 包。
步骤 6:验证环境
cd ~/zephyrproject/zephyr
west build -b qemu_cortex_m3 samples/hello_world
west build -t run
如果一切正常,QEMU 模拟器会启动并输出 Hello World! qemu_cortex_m3。这是最快的验证方式,无需真实硬件。
west build 报错找不到 cmake 或 ninja,请检查 cmake --version 是否 ≥ 3.20。Zephyr 3.7 要求 CMake 3.20 以上,建议安装最新版:sudo pip3 install cmake --upgrade。
2.3 案例拆解:在真实开发板上运行 Hello World
下面以常见的 STM32F411CEU6 BlackPill 开发板为例,演示从编译到烧录的完整闭环。该板载 ST-Link 调试器,通过 USB 连接电脑。
背景与目标: 验证环境搭建正确性,并确认开发板可以正常烧录和串口输出。
操作步骤:
- 连接硬件: 使用 USB 线连接 BlackPill 的 USB 口到电脑,确认设备管理器中出现
STM32 STLink设备。 - 编译固件:
cd ~/zephyrproject/zephyr west build -b blackpill_f411ce samples/hello_world - 烧录固件:
该命令会自动调用 ST-Link 的烧录工具(OpenOCD 或 pyOCD),将生成的west flashbuild/zephyr/zephyr.bin写入芯片 Flash。 - 查看串口输出:
如果 minicom 未安装,使用minicom -D /dev/ttyACM0 -b 115200sudo apt install minicom。也可以使用 VS Code 的 Serial Monitor 插件。
结果与分析: 串口输出如下:
*** Booting Zephyr OS build v3.7.0 ***
Hello World! blackpill_f411ce
如果烧录失败,常见原因包括:
- 权限问题: 执行
sudo usermod -aG dialout $USER并重新登录,以获取串口访问权限。 - ST-Link 驱动缺失: 在 Linux 下通常无需额外驱动,但需要安装
stlink-tools:sudo apt install stlink-tools。 - 板型名称错误: 使用
west boards | grep blackpill确认正确的 board 名称。
west init -m ... --mr v3.7.0 指定的版本。
2.4 配置 VS Code 开发环境
虽然命令行完全够用,但 VS Code 可以提供代码补全、语法高亮、断点调试等增强体验。推荐安装以下扩展:
| 扩展名 | 用途 | 关键配置 |
|---|---|---|
| C/C++(Microsoft) | 代码补全、IntelliSense、调试 | 配置 compile_commands.json 路径 |
| CMake Tools | CMake 构建集成 | 设置 cmake.sourceDirectory 指向应用目录 |
| Cortex-Debug | ARM 芯片的调试支持 | 配置 OpenOCD 路径和接口 |
| West Workspace | 识别 west 工作区,提供快捷命令 | 自动检测 .west/config |
关键配置步骤:
- 生成编译数据库: 在
west build时添加-d build参数,Zephyr 会自动生成build/compile_commands.json。然后在 VS Code 的c_cpp_properties.json中设置:{ "configurations": [ { "name": "Zephyr", "compileCommands": "${workspaceFolder}/build/compile_commands.json", "intelliSenseMode": "linux-gcc-arm" } ] } - 配置调试器: 在
launch.json中添加 Cortex-Debug 配置,指定device为stm32f411ce,serverpath指向 OpenOCD 可执行文件。 - 使用终端集成: 直接在 VS Code 终端中执行
west build和west flash,无需额外配置。
~/.bashrc 中添加以下别名,可以大幅提升操作效率:
alias zb='cd ~/zephyrproject/zephyr && west build -b blackpill_f411ce'
alias zf='west flash'
alias zt='west build -t run'
2.5 常见误区与总结复盘
误区一:使用系统自带的 GCC 编译 Zephyr。 Zephyr 必须使用 SDK 中的交叉编译器,因为系统 GCC 不支持 Zephyr 的链接脚本和特定选项。如果 west build 报错 CMAKE_C_COMPILER 指向 /usr/bin/gcc,说明环境变量 ZEPHYR_SDK_INSTALL_DIR 未正确设置。
误区二:忽略 Python 依赖。 缺少 pyelftools 会导致构建时无法解析 ELF 文件,报错 ModuleNotFoundError。务必执行 pip3 install -r requirements.txt。
误区三:west update 后不重新构建。 如果更新了 Zephyr 源码或模块,旧的构建目录可能缓存了过时的配置。建议在 west update 后执行 rm -rf build 清理构建目录。
误区四:混淆 board 名称。 不同开发板的 board 名称差异很大,例如 blackpill_f411ce 和 nucleo_f411re 虽然都是 STM32F411,但引脚定义和外设配置不同。使用 west boards 命令可以列出所有支持的板型。