2. 开发环境搭建:Zephyr SDK安装、West工具配置、目标板选择与编译
好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,Zephyr的环境搭建比Linux内核简单不少,但坑也不少。我当年第一次搞的时候,光West工具的版本就折腾了半天。咱们一步步来,别急。
2.1 Zephyr SDK安装
Zephyr SDK不是必须的,但强烈建议装。它包含了交叉编译工具链、QEMU模拟器、OpenOCD调试器等一整套东西。说白了,你装了这个,就不用自己一个个去凑工具了。
我个人习惯把SDK放在 /opt 目录下,这样所有用户都能用。当然你放 ~/zephyr-sdk 也行,看个人喜好。
安装步骤:
- 下载SDK包(我建议用0.16.8版本,稳定)
- 解压到目标目录
- 运行安装脚本
# 下载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-dev 和 python3-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 我的经验总结
环境搭建这块,说难不难,说简单也不简单。我总结几个要点:
- SDK版本要匹配: Zephyr主仓库和SDK版本要对应。我建议用LTS版本,比如v3.6 LTS配SDK 0.16.8。
- West的manifest文件别乱改: 除非你知道自己在做什么,否则别动
west.yml。我刚开始时手贱改了一次,结果所有模块版本都乱了。 - 先跑QEMU再上硬件: 没有硬件也能用QEMU模拟。虽然音频效果差了点,但至少能验证代码逻辑。
- 日志是调试的好帮手: 遇到问题先看
LOG_INF输出。Zephyr的日志系统很完善,别自己瞎猜。
好了,环境搭建就到这里。下一章咱们开始写第一个音频驱动——I2S接口的驱动。到时候我会手把手带你分析驱动框架,写代码,调试。准备好了吗?