2. 开发环境搭建

在开始I2C与SPI总线驱动开发之前,必须搭建一套完整、可复现的Zephyr开发环境。本章将引导你完成从零到构建第一个示例工程的完整流程,涵盖Zephyr SDK安装、west工具配置、源码获取与编译验证。所有操作均以Linux(Ubuntu 22.04 LTS)为基准,Windows/macOS用户可参考官方文档做相应调整。

前置检查:确保系统已安装Git(≥2.20)、CMake(≥3.20)、Python(≥3.8)及pip。使用 python3 --version && cmake --version && git --version 快速验证。

2.1 开发环境整体架构

下图展示了Zephyr开发环境的层次关系:west工具作为顶层工作流管理器,协调SDK、源码树与构建系统;Zephyr SDK提供跨平台编译器与调试器;应用工程通过CMake与Kconfig完成配置和编译。

Zephyr开发环境架构图 Zephyr 开发环境架构 west 工作流工具 Zephyr SDK Zephyr 源码树 应用工程 可执行固件(.elf / .hex / .bin) 说明: • west 负责初始化、更新、构建、刷写等全流程操作。 • Zephyr SDK 提供 arm-none-eabi-gcc、riscv64-unknown-elf-gcc 等工具链。 • 应用工程通过 CMakeLists.txt 和 prj.conf 描述驱动与总线配置。

2.2 安装Zephyr SDK

Zephyr SDK是预编译的跨平台工具链集合,包含编译器、链接器、调试器(GDB)以及QEMU模拟器。推荐使用官方提供的SDK安装脚本,避免手动配置工具链路径的繁琐过程。

2.2.1 下载与安装步骤

  1. 下载SDK安装包:访问 Zephyr SDK Releases,选择最新稳定版(如0.16.8),下载适用于Linux的 zephyr-sdk-0.16.8_linux-x86_64.tar.xz。
  2. 解压到目标目录:建议统一放在 /opt 下,避免权限问题。
  3. 运行安装脚本:脚本会自动设置环境变量并安装udev规则。
# 解压SDK
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.8/zephyr-sdk-0.16.8_linux-x86_64.tar.xz
sudo tar xf zephyr-sdk-0.16.8_linux-x86_64.tar.xz -C /opt

# 运行安装脚本
cd /opt/zephyr-sdk-0.16.8
sudo ./setup.sh

# 验证安装
ls /opt/zephyr-sdk-0.16.8/arm-zephyr-eabi/bin/
# 应看到 arm-zephyr-eabi-gcc, arm-zephyr-eabi-gdb 等文件
常见错误:如果 setup.sh 报错“Permission denied”,请确认已使用 sudo 执行。若系统缺少 libncurses5 或 libpython3.10,请先安装对应依赖包。

2.2.2 SDK目录结构

目录/文件 说明
arm-zephyr-eabi/ ARM Cortex-M/R/A 工具链(最常用)
riscv64-zephyr-elf/ RISC-V 64位工具链
xtensa-espressif_esp32/ Espressif ESP32 工具链
sysroots/ 目标系统根文件系统(用于QEMU)
setup.sh 安装脚本,配置环境变量与udev规则

2.3 配置west工具

west是Zephyr的元构建工具,封装了CMake、Ninja和自定义命令。它通过manifest文件管理多个仓库(zephyr、modules、applications),实现一键初始化、更新和构建。

2.3.1 安装west

# 使用pip安装west
pip3 install --user west

# 确认安装成功
west --version
# 输出示例:West version: v1.2.0

2.3.2 初始化工作区

创建一个空目录作为Zephyr工作区,然后使用 west init 拉取主仓库和manifest文件。

# 创建工作区目录
mkdir ~/zephyr-workspace
cd ~/zephyr-workspace

# 初始化(使用官方manifest)
west init -m https://github.com/zephyrproject-rtos/zephyr --mr v3.6.0

# 拉取所有模块(zephyr、hal、modules等)
west update
关键概念:west init 只下载 .west/config 和 west.yml 清单文件;west update 才真正克隆所有仓库。首次更新会下载约2-3GB数据,请确保网络稳定。

2.3.3 导出Zephyr CMake包

为了让CMake能够找到Zephyr构建系统,需要导出CMake包路径:

# 从zephyr仓库根目录导出
cd ~/zephyr-workspace/zephyr
west zephyr-export

# 验证CMake能找到Zephyr
cmake -P zephyr/cmake/verify-toolchain.cmake

2.4 创建并构建第一个示例工程

使用Zephyr内置的 samples/basic/blinky 作为第一个工程,它控制开发板上的LED闪烁,是验证工具链和构建流程是否正确的标准测试。

2.4.1 创建工程目录

# 在工作区外创建应用目录(推荐做法)
mkdir ~/zephyr-apps
cd ~/zephyr-apps

# 复制blinky示例
cp -r ~/zephyr-workspace/zephyr/samples/basic/blinky ./my-blinky
cd my-blinky

2.4.2 工程文件结构

文件 作用
CMakeLists.txt 定义应用名称、源文件、依赖的Zephyr模块
prj.conf Kconfig配置,启用GPIO、I2C、SPI等驱动
src/main.c 应用主逻辑,调用Zephyr API控制硬件
boards/ (可选)板级覆盖配置,如引脚映射

2.4.3 构建工程

使用 west build 命令指定目标板(如 nrf52840dk_nrf52840)和构建目录。

# 设置Zephyr基础环境变量(每次新终端都需要)
export ZEPHYR_BASE=~/zephyr-workspace/zephyr
source $ZEPHYR_BASE/zephyr-env.sh

# 构建blinky,目标板为nRF52840 DK
west build -b nrf52840dk_nrf52840 -d build

# 构建输出示例
# -- west build: generating a build system
# -- west build: building
# [1/100] Building C object zephyr/CMakeFiles/zephyr.dir...
# [100/100] Linking C executable zephyr/zephyr.elf
常用目标板别名:nrf52840dk_nrf52840(Nordic)、stm32f429_disco(ST)、esp32_devkitc_wroom(Espressif)、qemu_cortex_m3(QEMU模拟)。使用 west boards 可列出所有支持的板卡。

2.4.4 构建产物验证

构建成功后,检查生成的文件:

ls -lh build/zephyr/
# 关键文件:
#   zephyr.elf      - 带符号的ELF文件(用于调试)
#   zephyr.hex      - Intel HEX格式(用于烧录)
#   zephyr.bin      - 纯二进制镜像
#   zephyr.map      - 内存映射文件(分析RAM/ROM占用)

2.5 使用QEMU验证(无硬件也可运行)

如果没有物理开发板,可以使用QEMU模拟Cortex-M3平台运行blinky示例,验证环境配置正确性。

# 使用QEMU目标板构建
west build -b qemu_cortex_m3 -d build-qemu

# 运行(自动启动QEMU窗口)
west build -t run -d build-qemu

# 终端输出示例:
# *** Booting Zephyr OS build v3.6.0 ***
# LED state: ON
# LED state: OFF
# ...(每500ms切换一次)
QEMU注意事项:确保已安装 qemu-system-arm(Ubuntu: sudo apt install qemu-system-arm)。如果QEMU窗口无显示,尝试添加 -nographic 参数:west build -t run -d build-qemu -- -nographic。

2.6 环境验证清单

完成上述步骤后,使用下表逐项确认环境就绪:

检查项 验证命令 预期结果
west工具 west --version ≥ v1.2.0
Zephyr SDK ls /opt/zephyr-sdk-0.16.8/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc 文件存在
CMake cmake --version ≥ 3.20
Python python3 --version ≥ 3.8
构建blinky west build -b nrf52840dk_nrf52840 -d build 构建成功,生成zephyr.elf
QEMU运行 west build -b qemu_cortex_m3 -d build-qemu && west build -t run -d build-qemu LED状态交替打印

2.7 常见问题与解决

  • west update 失败(网络超时):使用代理或更换镜像源。在 ~/.west/config 中设置 [remote "origin"] url = https://gitee.com/zephyrproject-rtos/zephyr(国内用户)。
  • CMake找不到Zephyr:确认已执行 west zephyr-export 并 source zephyr-env.sh。
  • 编译报错“arm-zephyr-eabi-gcc: not found”:检查 ZEPHYR_SDK_INSTALL_DIR 环境变量是否指向SDK根目录。
  • QEMU窗口黑屏:尝试使用 west build -t run -d build-qemu -- -nographic 在终端显示串口输出。
最佳实践:将环境变量设置写入 ~/.bashrc 或 ~/.zshrc,避免每次打开终端重复执行:
echo 'export ZEPHYR_BASE=~/zephyr-workspace/zephyr' >> ~/.bashrc
echo 'source $ZEPHYR_BASE/zephyr-env.sh' >> ~/.bashrc
source ~/.bashrc