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一下就能用。

⚠️ 注意: 如果你用的是Windows WSL,记得把SDK放在Linux文件系统下(比如/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.cCMakeLists.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。它会通过默认的串口输出。

💡 小技巧: 如果你用的开发板没有串口转USB芯片,记得外接一个USB转TTL模块。我刚开始做Zephyr时,以为代码烧进去就完事了,结果啥输出都没有——原来是串口没接。

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卡了半天,最后报了个"无法连接目标"的错误。

查看输出

烧录完成后,用串口工具(比如screenminicomputty)连接开发板的串口。波特率一般是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的定时器玩明白。