2. 开发环境搭建:Zephyr SDK安装、West工具配置、目标板支持包(BSP)导入

好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,很多初学者在Zephyr上栽跟头,十有八九是环境没配好。我自己刚开始接触Zephyr时,光装SDK就折腾了两天——嗯,那时候文档还没现在这么全。

环境搭建说白了就三步:装SDK、配West工具、导入板级支持包。咱们一个一个来。

2.1 Zephyr SDK安装

Zephyr SDK不是普通的编译器,它是一整套工具链。包括GCC编译器、调试器、QEMU模拟器等等。我建议你直接下载官方打包好的SDK,别自己从源码编译——那太费时间了。

2.1.1 下载SDK

先确认你的主机系统。我这边以Ubuntu 22.04 LTS为例,Windows用户建议用WSL2。

# 下载SDK(版本号以官方最新为准)
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.8/zephyr-sdk-0.16.8_linux-x86_64.tar.xz

# 解压到指定目录
tar xvf zephyr-sdk-0.16.8_linux-x86_64.tar.xz -C ~/

这里有个坑:解压路径不要有中文或空格。我曾经帮一个学员排查问题,发现他解压到了「下载 (2)」文件夹,结果死活编译不过。

2.1.2 运行安装脚本

cd ~/zephyr-sdk-0.16.8
./setup.sh

安装脚本会做几件事:

  • 注册工具链到系统
  • 安装udev规则(方便调试器识别)
  • 配置CMake的toolchain文件
我的经验:如果setup.sh报权限错误,别急着加sudo。先检查一下~/zephyr-sdk-0.16.8目录的所有权。我遇到过有人用root解压,导致普通用户无法访问。

2.1.3 验证安装

# 检查工具链版本
~/zephyr-sdk-0.16.8/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc --version

# 输出应该类似:
# arm-zephyr-eabi-gcc (Zephyr SDK 0.16.8) 12.2.0

看到版本号就说明SDK装好了。如果提示「No such file」,八成是路径写错了。

2.2 West工具配置

West是Zephyr的元构建工具。说白了,它帮你管理多个仓库、拉取依赖、执行构建。没有West,你手动操作会累死。

2.2.1 安装West

West是个Python包,用pip装就行。我个人习惯用虚拟环境,避免污染系统Python。

# 创建虚拟环境(推荐)
python3 -m venv ~/zephyr-venv
source ~/zephyr-venv/bin/activate

# 安装West
pip install west
注意:每次打开新终端,都要先执行 source ~/zephyr-venv/bin/activate。我一开始老忘,后来在.bashrc里加了一行自动激活。

2.2.2 初始化Zephyr工作区

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

# 初始化(拉取Zephyr主仓库)
west init

# 拉取所有子模块(这一步比较慢,看网速)
west update

west update会下载Zephyr内核、HAL库、驱动等。你想想看,这要是手动git clone得多少次?West一条命令全搞定。

2.2.3 配置环境变量

Zephyr需要知道SDK和工具链的位置。我建议写到~/.zephyrrc文件里:

# 编辑 ~/.zephyrrc
export ZEPHYR_BASE=~/zephyr-workspace/zephyr
export ZEPHYR_SDK_INSTALL_DIR=~/zephyr-sdk-0.16.8
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr

# 然后source一下
source ~/.zephyrrc

为什么要单独写个文件?因为West会自动加载它。你每次执行west build时,这些变量就自动生效了。

2.3 目标板支持包(BSP)导入

BSP就是板级支持包。Zephyr支持几百种开发板,但你的板子可能不在官方列表里。这时候就需要自己导入BSP。

2.3.1 查看支持的开发板

# 列出所有支持的板子
west boards

# 输出片段:
# ...
# nrf52840dk_nrf52840
# stm32f429i_disc1
# esp32_devkitc_wroom
# ...

如果你的板子在列表里,直接编译就行。比如我常用的nRF52840 DK:

west build -b nrf52840dk_nrf52840 samples/hello_world

2.3.2 导入第三方BSP

假设你用的是某国产芯片,官方提供了Zephyr BSP。怎么导入?

# 方法一:直接复制到工作区
cp -r vendor_bsp/* ~/zephyr-workspace/zephyr/boards/arm/

# 方法二:通过West manifest添加(推荐)
west config manifest.path ~/zephyr-workspace/zephyr
west config manifest.file west.yml

# 编辑west.yml,添加远程仓库
# 然后执行 west update
关键点:BSP通常包含以下文件:
  • board.cmake - 构建配置
  • board.dts - 设备树描述
  • board_pinmux.c - 引脚复用
  • Kconfig.board - 配置选项
缺一不可,否则编译会报错。

2.3.3 验证BSP是否生效

# 再次列出板子,看是否出现新板
west boards | grep your_board_name

# 尝试编译一个最小工程
west build -b your_board_name samples/minimal

如果编译通过,恭喜你,BSP导入成功。如果报错,八成是设备树文件有问题。我遇到过最坑的一次,是某个BSP的.dts文件里引用了不存在的GPIO控制器。

2.4 常见问题与避坑

环境搭建这块,我踩过的坑比走过的路还多。挑几个典型的说说:

问题 现象 解决方案
Python版本过低 West安装失败 升级到Python 3.8+
CMake找不到工具链 编译时报错"No CMAKE_TOOLCHAIN_FILE" 检查ZEPHYR_SDK_INSTALL_DIR是否设置
West update卡住 下载到一半不动了 换国内镜像源,或者用代理
BSP编译报错 undefined reference to ... 检查board.cmake中的依赖是否完整
我的建议:第一次搭建环境,最好用官方推荐的开发板(比如nRF52840 DK或STM32F4 Discovery)。等流程跑通了,再折腾自己的板子。别一上来就挑战冷门芯片,容易劝退。

好了,环境搭建就这些。下一章咱们开始写第一个Zephyr应用程序——点灯。别小看点灯,它背后涉及设备树、驱动模型、线程调度,够你消化一阵子的。