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文件
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
- 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中的依赖是否完整 |
好了,环境搭建就这些。下一章咱们开始写第一个Zephyr应用程序——点灯。别小看点灯,它背后涉及设备树、驱动模型、线程调度,够你消化一阵子的。