2. 开发环境搭建:Zephyr SDK安装、West工具配置、目标板选择与编译

好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,Zephyr的环境搭建比Linux内核简单不少,但坑也不少。我当年第一次搞的时候,光West工具的版本就折腾了半天。咱们一步步来,别急。

2.1 Zephyr SDK安装

Zephyr SDK不是必须的,但强烈建议装。它包含了交叉编译工具链、QEMU模拟器、OpenOCD调试器等一整套东西。说白了,你装了这个,就不用自己一个个去凑工具了。

我个人习惯把SDK放在 /opt 目录下,这样所有用户都能用。当然你放 ~/zephyr-sdk 也行,看个人喜好。

安装步骤:

  1. 下载SDK包(我建议用0.16.8版本,稳定)
  2. 解压到目标目录
  3. 运行安装脚本
# 下载SDK(以Linux x86_64为例)
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.8/zephyr-sdk-0.16.8_linux-x86_64.tar.xz

# 解压
tar xf zephyr-sdk-0.16.8_linux-x86_64.tar.xz -C /opt/

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

安装脚本会帮你配置好工具链路径,还会安装udev规则。嗯,这里要注意,如果你用的是Ubuntu 22.04以上版本,可能需要手动装一下 libfdt-devpython3-pyelftools。我上次在一台新机器上装,就卡在这儿了。

小技巧: 安装完成后,检查一下 /opt/zephyr-sdk-0.16.8/sysroots 目录,看看有没有你目标架构的文件夹。比如 aarch64-zephyr-elf 就是ARM64的。没有的话,说明下载的SDK包不对。

2.2 West工具配置

West是Zephyr的元构建工具。它负责管理多个仓库、拉取依赖、执行构建。说白了,你以后所有操作都离不开它。

安装West很简单,用pip就行。但我建议用虚拟环境,避免污染系统Python。

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

# 安装West
pip install west

# 验证安装
west --version

West装好后,需要初始化一个工作空间。这个工作空间会包含Zephyr主仓库、所有模块(比如音频编解码器驱动、DSP库等)。

# 创建工作空间
mkdir ~/zephyr-workspace
cd ~/zephyr-workspace

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

# 拉取所有模块(这一步比较慢,取决于网络)
west update

我曾经遇到过 west update 卡在某个仓库不动的情况。后来发现是网络问题,换成国内镜像就好了。你可以这样配:

# 在 ~/zephyr-workspace/.west/config 中修改
[manifest]
path = zephyr
file = west.yml

[zephyr]
base = https://gitee.com/zephyr-rtos/zephyr  # 换成Gitee镜像

注意: 如果你用Gitee镜像,记得 west update 之后检查一下模块版本。镜像可能不是实时同步的。我建议还是用官方源,实在不行再换镜像。

2.3 目标板选择

Zephyr支持300多款开发板。咱们做音频处理,我推荐几款常用的:

开发板 SoC 音频特性 适合场景
nRF5340 DK nRF5340 双核、I2S、PDM 低功耗音频、蓝牙音频
STM32H743 STM32H743 SAI、DFSDM、DAC 高性能音频处理
i.MX RT1060 EVK MIMXRT1062 SAI、SPDIF、MQS 实时音频、音频算法
ESP32-S3 ESP32-S3 I2S、PDM、DAC WiFi/BLE音频

我个人习惯用nRF5340 DK做原型验证。为什么?因为它双核架构,一个核跑音频处理,一个核跑协议栈,互不干扰。而且Nordic的文档写得清楚,SDK集成度高。

你想想看,如果你刚开始学,选个太冷门的板子,遇到问题连个问的人都没有。所以我的建议是:先用官方支持的板子,等熟悉了再换。

2.4 编译第一个音频示例

环境搭好了,板子选好了,咱们来编译一个实际的音频示例。Zephyr自带了一个 audio/audio_mix 示例,它演示了如何混音和播放音频。

# 设置环境变量
export ZEPHYR_BASE=~/zephyr-workspace/zephyr
source $ZEPHYR_BASE/zephyr-env.sh

# 编译音频混音示例(以nRF5340 DK为例)
cd ~/zephyr-workspace
west build -b nrf5340dk_nrf5340_cpuapp zephyr/samples/audio/audio_mix

# 如果你用QEMU模拟(没有硬件也能跑)
west build -b qemu_cortex_m3 zephyr/samples/audio/audio_mix

编译完成后,你会看到类似这样的输出:

-- west build: generating a build system
-- west build: building
[1/100] Building C object zephyr/CMakeFiles/zephyr.dir/drivers/audio/audio_dmic.c.obj
...
[100/100] Linking C object zephyr/zephyr.elf
-- west build: build complete

嗯,这里要注意。如果你编译时遇到 undefined reference to 'audio_dmic_init' 之类的错误,多半是Kconfig配置没开。音频驱动默认是关闭的,需要手动打开。

配置方法:prj.conf 中添加以下配置:

CONFIG_AUDIO=y
CONFIG_AUDIO_DMIC=y
CONFIG_AUDIO_I2S=y

或者用 west build -t menuconfig 图形化配置。

2.5 烧录与验证

编译出 zephyr.elf 后,烧录到板子上。不同板子烧录方式不同:

  • nRF5340 DK:west flash 自动识别JLink
  • STM32H743:west flash --runner openocd
  • i.MX RT1060:west flash --runner pyocd
  • ESP32-S3:west flash --runner esp32
# 烧录到nRF5340 DK
west flash

# 查看串口输出(默认115200波特率)
screen /dev/ttyACM0 115200

烧录成功后,串口会输出音频处理的相关日志。比如采样率、缓冲区大小、混音参数等。如果听到板子上的喇叭有声音输出,恭喜你,环境搭建成功了!

常见问题: 如果你烧录后串口没输出,先检查一下板子供电。我遇到过好几次,板子没上电,折腾了半天才发现。另外,有些板子需要按住复位键再烧录,比如STM32系列。

2.6 我的经验总结

环境搭建这块,说难不难,说简单也不简单。我总结几个要点:

  1. SDK版本要匹配: Zephyr主仓库和SDK版本要对应。我建议用LTS版本,比如v3.6 LTS配SDK 0.16.8。
  2. West的manifest文件别乱改: 除非你知道自己在做什么,否则别动 west.yml。我刚开始时手贱改了一次,结果所有模块版本都乱了。
  3. 先跑QEMU再上硬件: 没有硬件也能用QEMU模拟。虽然音频效果差了点,但至少能验证代码逻辑。
  4. 日志是调试的好帮手: 遇到问题先看 LOG_INF 输出。Zephyr的日志系统很完善,别自己瞎猜。

好了,环境搭建就到这里。下一章咱们开始写第一个音频驱动——I2S接口的驱动。到时候我会手把手带你分析驱动框架,写代码,调试。准备好了吗?