1. Zephyr初体验:从零开始,跑起你的第一个RTOS

大家好,欢迎来到这门课的第一章。

说实话,每次带新人入门Zephyr,我最怕听到的就是「环境装了两天还没搞定」。嵌入式开发的门槛,往往不是代码本身,而是那个让人抓狂的工具链配置过程。所以这一章,我尽量把坑都提前踩一遍,你跟着走就行。

1.1 Zephyr RTOS到底是什么?

Zephyr是一个开源、可裁剪的实时操作系统(RTOS),专门为资源受限的嵌入式设备设计。它由Linux基金会托管,背后有Intel、Nordic、NXP等大厂在推。

你想想看,一个RTOS要同时支持ARM、RISC-V、x86、Xtensa这么多架构,还要能在只有几十KB RAM的MCU上跑——这本身就是个技术活。

核心定位:Zephyr不是Linux的替代品,而是填补「裸机编程」和「大型Linux系统」之间的空白。说白了,当你的项目需要多任务、需要协议栈、但又跑不动Linux时,Zephyr就是那个最佳选择。

1.2 发展历史:从一个小众项目到行业标准

Zephyr的故事其实挺有意思。它最早是Wind River(就是做VxWorks那家)内部的一个微内核项目,叫Rocket。2016年,Wind River把它捐给了Linux基金会,改名Zephyr。

我记得2017年刚接触Zephyr时,它的文档还少得可怜,社区也就几百号人。但到了2024年,它已经是GitHub上星标最多的RTOS之一,贡献者超过2000人。

时间 里程碑
2016 Wind River将Rocket捐给Linux基金会,改名Zephyr
2017 发布1.0版本,支持ARM Cortex-M系列
2019 加入RISC-V支持,成为Linux基金会顶级项目
2021 发布2.6版本,引入Devicetree和CMake构建系统
2023 3.x系列成熟,支持超过500种开发板

1.3 核心优势:为什么选Zephyr而不是FreeRTOS?

这个问题我几乎每次培训都会被问到。我的回答是:看项目需求。

FreeRTOS当然好,轻量、稳定、生态成熟。但Zephyr有几个它没有的东西:

  • 统一的驱动框架:不管换什么MCU,API基本不变。我在项目中从STM32换到nRF52840,驱动代码几乎没改。
  • 内置协议栈:蓝牙、WiFi、USB、TCP/IP……开箱即用,不用自己移植。
  • Devicetree + Kconfig:硬件描述和配置分离,代码可移植性极强。
  • 安全机制:支持TrustZone、MPU隔离,适合需要认证的产品。

我的建议:如果你做的是消费级IoT产品,Zephyr的蓝牙协议栈和OTA更新机制能帮你省至少3个月的开发时间。

1.4 搭建开发环境:Linux/macOS/Windows全攻略

嗯,这里要注意。Zephyr的环境搭建在不同系统上差异挺大,我分别讲。

1.4.1 Linux(Ubuntu 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

# 安装Zephyr SDK
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.5/zephyr-sdk-0.16.5_linux-x86_64.tar.xz
tar xf zephyr-sdk-0.16.5_linux-x86_64.tar.xz
cd zephyr-sdk-0.16.5
./setup.sh

# 获取Zephyr源码
pip3 install west
west init ~/zephyrproject
cd ~/zephyrproject
west update

我曾经帮一个客户配环境,他用的Ubuntu 20.04,结果Python版本太低,折腾了两小时。所以建议直接用22.04或更新版本。

1.4.2 macOS

macOS上主要靠Homebrew。有个坑:Apple Silicon(M1/M2)的Mac需要额外装Rosetta 2。

# 安装Homebrew(如果没有)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 安装依赖
brew install cmake ninja gperf python3 ccache qemu dtc wget

# 安装Zephyr SDK(macOS版)
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.5/zephyr-sdk-0.16.5_macos-x86_64.tar.xz
tar xf zephyr-sdk-0.16.5_macos-x86_64.tar.xz
cd zephyr-sdk-0.16.5
./setup.sh

注意:macOS上如果遇到「xcrun: error: invalid active developer path」,说明你没装Xcode Command Line Tools。运行 xcode-select --install 即可。

1.4.3 Windows

Windows上我建议用West + MSYS2或者直接用VS Code的Dev Containers。这里给一个相对稳定的方案:

# 1. 安装Chocolatey(包管理器)
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

# 2. 安装工具链
choco install cmake ninja gperf python3 git dtc-msys2 wget

# 3. 安装Zephyr SDK
# 下载Windows版SDK安装包,双击安装即可

说实话,Windows上最烦的是路径问题。我建议所有路径都不要有中文和空格,项目目录直接放 C:\zephyrproject。

1.5 编译并烧录第一个示例程序:Hello World

环境搭好了,我们来跑第一个程序。目标板我用的是 nRF52840 DK,你也可以换成自己的板子。

1.5.1 创建并编译项目

# 进入Zephyr源码目录
cd ~/zephyrproject/zephyr

# 编译Hello World示例
west build -b nrf52840dk_nrf52840 samples/hello_world

# 如果你没有开发板,可以用QEMU模拟
west build -b qemu_cortex_m3 samples/hello_world
west build -t run

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

-- west build: building
[0/1] Generating include/generated/version.h
[1/2] Building C object zephyr/CMakeFiles/zephyr.dir/arch/arm/core/thread.c.obj
...
[100/100] Linking C executable zephyr/zephyr.elf

1.5.2 烧录到开发板

# 连接开发板,然后
west flash

如果一切顺利,串口输出应该是:

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

避坑指南:我曾经遇到过烧录后没输出,结果发现是串口波特率没对上。Zephyr默认是115200,8N1,检查一下你的串口工具设置。

1.6 Zephyr开发流程全景图

为了让你对整个开发流程有个直观认识,我画了一张图:

Zephyr开发流程全景图 Zephyr开发流程全景图 1. 环境搭建 SDK + West + 工具链 2. 获取源码 west init + west update 3. 配置项目 Kconfig + Devicetree 4. 编译 west build -b <board> 5. 烧录 west flash 6. 调试 串口 + GDB + 日志 迭代开发循环 💡 关键点: • 配置阶段(Kconfig + Devicetree)是Zephyr区别于其他RTOS的核心 • 编译时指定 -b 参数选择目标板,不同板子自动适配驱动 • 调试阶段建议先开串口,确认系统启动正常

1.7 本章小结

这一章我们走完了Zephyr的完整入门流程:从了解它是什么,到搭建环境,再到跑起第一个程序。你可能会觉得「就这?Hello World而已」,但相信我,这个基础打好了,后面学内核调度、内存管理时会轻松很多。

嗯,最后说一句:如果环境搭建遇到问题,别硬扛。去Zephyr的Discord或者邮件列表问,社区很活跃。我曾经凌晨两点发帖,十分钟就有人回复了——这就是开源社区的魅力。