2. 开发环境搭建:Zephyr RTOS 与 ESP-IDF 环境配置、命令行工具链安装、第一个 Hello World 程序编译与下载

做嵌入式开发,环境搭建是第一道坎。很多人觉得装个 IDE 点几下就行,但搞无线 MCU 低功耗协议栈,命令行工具链才是常态。我个人习惯把环境分成两层:一层是 Zephyr RTOS,另一层是 ESP-IDF。这两套东西各有各的脾气,但摸透了其实挺顺手的。

2.1 为什么需要两套环境?

你可能会问:一个项目为什么搞两套工具链?说白了,Zephyr 是通用 RTOS,支持几十种芯片;ESP-IDF 是乐鑫官方的 IoT 开发框架,对 ESP32 系列做了深度优化。我在项目中遇到过这样的情况:用 Zephyr 做协议栈原型验证很快,但到了量产阶段,ESP-IDF 的蓝牙和 Wi-Fi 驱动更稳定。所以两套都得会。

对比项 Zephyr RTOS ESP-IDF
适用芯片 多厂商(ARM、RISC-V、Xtensa) ESP32 系列为主
协议栈 内置 BLE / 802.15.4 / LoRaWAN ESP-BLE / ESP-WiFi / ESP-Mesh
构建系统 CMake + West CMake + idf.py
调试工具 OpenOCD + GDB OpenOCD + GDB / 内置 JTAG
OTA 支持 MCUboot + 自定义 原生 OTA + 安全启动

2.2 Zephyr RTOS 环境配置

Zephyr 的安装流程,我踩过不少坑。这里直接给出一套经过验证的步骤。

2.2.1 安装依赖

Ubuntu 20.04/22.04 下,先装基础包:

sudo apt update
sudo apt install --no-install-recommends git cmake ninja-build gperf \
  ccache dfu-util device-tree-compiler wget \
  python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \
  make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1
我的习惯: 装完这些后,我会顺手把 pip 源换成国内镜像,不然下载 Python 包能等到怀疑人生。

2.2.2 安装 West 工具

West 是 Zephyr 的元构建工具。说白了,它帮你管理多个仓库的版本和依赖。

pip3 install west

然后初始化 Zephyr 工作区:

west init ~/zephyrproject
cd ~/zephyrproject
west update

这一步会下载 Zephyr 内核、hal 层、各种驱动和协议栈。网络不好的话,我曾经等过半小时才跑完。

2.2.3 安装工具链

Zephyr 支持多种工具链。我推荐用 Zephyr SDK,它包含了所有需要的交叉编译器:

cd ~
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.5-1/zephyr-sdk-0.16.5-1_linux-x86_64.tar.xz
tar xf zephyr-sdk-0.16.5-1_linux-x86_64.tar.xz
cd zephyr-sdk-0.16.5-1
./setup.sh
注意: 安装完成后,记得把工具链路径加到 ~/.zephyrrc 文件里,否则每次编译都要手动指定。

2.3 ESP-IDF 环境配置

ESP-IDF 的安装相对简单,但版本管理是个坑。我建议用官方提供的安装脚本。

2.3.1 获取 ESP-IDF

mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh esp32

这里 esp32 是目标芯片。如果你用 ESP32-S3 或 ESP32-C3,改成对应的名字就行。

2.3.2 设置环境变量

每次打开新终端,都需要执行:

. ~/esp/esp-idf/export.sh

我个人习惯把这行加到 ~/.bashrc 里,省得每次手动敲。

2.4 第一个 Hello World 程序

环境搭好了,来跑个 Hello World 验证一下。这里分别给出 Zephyr 和 ESP-IDF 的版本。

2.4.1 Zephyr 版 Hello World

先创建一个项目:

cd ~/zephyrproject
west build -b esp32_devkitc_wrover zephyr/samples/hello_world

编译完成后,烧录到开发板:

west flash

然后用串口工具查看输出:

minicom -D /dev/ttyUSB0 -b 115200

你会看到:

*** Booting Zephyr OS build v3.5.0 ***
Hello World! esp32_devkitc_wrover

避坑指南: 我第一次用 west flash 时,死活烧不进去。后来发现是 USB 转串口驱动没装。ESP32 的 CP2102 芯片需要装驱动,Ubuntu 下直接 sudo apt install cp210x-dkms 就行。

2.4.2 ESP-IDF 版 Hello World

ESP-IDF 自带示例,直接复制出来编译:

cp -r ~/esp/esp-idf/examples/get-started/hello_world ~/hello_world
cd ~/hello_world
idf.py set-target esp32
idf.py build
idf.py -p /dev/ttyUSB0 flash
idf.py -p /dev/ttyUSB0 monitor

输出类似:

Hello world!
This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision v3.0, 4MB external flash

2.5 知识体系总览

下面这张图概括了本章的核心逻辑:从开发机到目标板,工具链如何串联起来。

开发环境搭建流程 开发环境搭建流程 开发机(Linux/Win/Mac) Zephyr RTOS 工具链 ESP-IDF 工具链 West 构建 + CMake Zephyr SDK 交叉编译 west flash 烧录 idf.py 构建 + CMake GCC for Xtensa 编译 idf.py flash 烧录 ESP32 目标板(串口输出) 两套工具链最终都输出到串口

2.6 常见问题与避坑

  • 编译报错找不到 Python 模块: 检查 pip 是否安装完整,或者用 pip3 install -r requirements.txt 重新装一遍。
  • 烧录失败: 先确认串口设备权限。运行 sudo usermod -a -G dialout $USER 然后注销重登。
  • Zephyr 编译慢: 第一次编译会下载大量依赖。我建议用 west build -t menuconfig 先裁剪配置,减少不必要的模块。
  • ESP-IDF 版本冲突: 不同项目可能依赖不同版本。用 git checkout 切换分支,或者用 Docker 隔离环境。

我的小技巧: 在 ~/.bashrc 里加两个 alias:alias zephyr='source ~/zephyrproject/zephyr/zephyr-env.sh' 和 alias esp='. ~/esp/esp-idf/export.sh'。这样切换环境只需敲一个命令。

嗯,环境搭建这部分就到这里。记住一个原则:命令行工具链虽然看着麻烦,但自动化脚本和 CI/CD 集成全靠它。别怕敲命令,敲多了就顺手了。