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
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 知识体系总览
下面这张图概括了本章的核心逻辑:从开发机到目标板,工具链如何串联起来。
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 集成全靠它。别怕敲命令,敲多了就顺手了。