2. 开发环境搭建:Zephyr SDK安装、west工具配置、创建第一个Zephyr工程、编译与烧录
好,咱们正式开始动手了。
这一章,我带你把Zephyr的开发环境从头到尾捋一遍。说实话,很多初学者倒在了环境搭建这一步——不是装不上,就是装完了跑不起来。我当年第一次搞Zephyr时,光SDK就折腾了两天,后来发现是路径写错了。嗯,咱们今天争取半小时搞定。
2.1 Zephyr SDK安装
Zephyr SDK不是Zephyr源码本身,而是一套交叉编译工具链。说白了,就是让你的PC能编译出给ARM、RISC-V等目标芯片跑的二进制文件。
第一步:下载SDK
我个人习惯去Zephyr官网的GitHub Release页面下载。别用包管理器,容易版本不匹配。选最新的LTS版本就行,比如目前稳定的是0.16.x。
# 以Linux为例,下载到~/目录
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.8/zephyr-sdk-0.16.8_linux-x86_64.tar.xz
第二步:解压并安装
解压后有个setup.sh脚本,运行它就行。这里有个坑——一定要用sudo,因为脚本会往/opt目录写东西。
cd ~
tar xf zephyr-sdk-0.16.8_linux-x86_64.tar.xz
cd zephyr-sdk-0.16.8
sudo ./setup.sh
安装完成后,脚本会自动把工具链路径加到/etc/profile.d/里。重启终端或手动source一下就能用。
/home/yourname/),别放/mnt/c/里。我在项目中遇到过WSL跨文件系统访问导致权限错乱的问题,编译时各种诡异报错。
2.2 west工具配置
west是Zephyr的瑞士军刀。它负责拉代码、管理模块、编译、烧录……几乎一切操作都靠它。
安装west
用pip装,简单粗暴:
pip3 install west
装完后验证一下:
west --version
如果显示版本号,说明装好了。如果提示command not found,八成是Python的bin目录没在PATH里。我建议你检查一下~/.local/bin有没有加进去。
初始化工作空间
Zephyr的源码管理方式有点特别——它用west init拉一个manifest仓库,然后west update把所有模块(比如驱动库、网络栈)都下载下来。你想想看,如果手动一个个git clone,那得累死。
mkdir zephyr_project
cd zephyr_project
west init
west update
这个过程会下载大概1-2GB的数据,取决于网络状况。我建议你找个网速好的时间段搞,或者挂个代理。
导出Zephyr路径
为了让编译器能找到Zephyr的头文件和库,需要设置环境变量:
export ZEPHYR_BASE=~/zephyr_project/zephyr
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
我个人习惯把这俩加到~/.bashrc里,省得每次开终端都要敲一遍。
2.3 创建第一个Zephyr工程
环境搭好了,咱们来写个经典的"Hello World"。不过Zephyr的Hello World不是打印到屏幕,而是通过串口输出。
创建工程
用west的模板功能:
west create -t zephyr hello_world
cd hello_world
这会生成一个最小工程,包含src/main.c和CMakeLists.txt。打开main.c看看:
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/uart.h>
void main(void)
{
printk("Hello World! %s\n", CONFIG_BOARD);
}
嗯,代码很简单。printk是Zephyr的内核打印函数,类似C语言的printf。它会通过默认的串口输出。
2.4 编译与烧录
编译
编译前要指定目标板。比如我用的是nrf52840dk_nrf52840:
west build -b nrf52840dk_nrf52840
第一次编译会下载一些依赖,然后开始编译。整个过程大概1-3分钟。如果看到Build completed successfully,恭喜你,环境没问题。
你可能会问:我怎么知道我的板子叫什么名字?用这个命令列出所有支持的板子:
west boards
输出会很长,你可以用grep过滤,比如west boards | grep stm32。
烧录
烧录更简单,一条命令搞定:
west flash
它会自动检测调试器(JLink、ST-Link、OpenOCD等)。如果检测不到,八成是驱动没装好。我建议你提前装好对应调试器的驱动。
west flash卡了半天,最后报了个"无法连接目标"的错误。
查看输出
烧录完成后,用串口工具(比如screen、minicom、putty)连接开发板的串口。波特率一般是115200。你应该能看到:
*** Booting Zephyr OS build v3.5.0 ***
Hello World! nrf52840dk_nrf52840
看到这行输出,说明你的Zephyr开发环境已经完整搭建起来了。嗯,这一步走通了,后面的课程就顺了。
2.5 避坑指南
最后,我总结几个常见问题,都是我在项目中踩过的坑:
- Python版本太低:Zephyr要求Python 3.8以上。用
python3 --version检查一下。如果版本低,建议装个pyenv管理多版本。 - CMake版本不匹配:Zephyr 3.x要求CMake 3.20以上。用
cmake --version确认。 - 磁盘空间不足:Zephyr SDK + 源码 + 编译产物,轻松吃掉10GB。确保你的磁盘够用。
- 网络问题:
west update时如果卡住,试试挂代理,或者换个时间段再试。
好了,环境搭建就到这里。下一章咱们开始写真正的工业控制代码——定时器中断。到时候我会带你从理论到实战,把Zephyr的定时器玩明白。