知识门户

返回

第 11 章:Embassy 生态与视野拓展

Part2 深入embassy框架

views | comments

本章要回答的问题:除了 embassy-sync,Embassy 生态还有哪些强大的库?我能用 Embassy 做什么?后续怎么深入学习?

本章定位:概览性质。每个主题只介绍”是什么 + 一个最小示例 + 去哪里深入”,不展开完整教程。读完本章,你将获得 Embassy 生态的完整地图,知道每个方向”能做什么”和”去哪里学”。


11.1 Embassy 生态全景#

经过前面四章的学习,你已经掌握了 Embassy 的核心:Executor(第 9 章)、HAL(第 8 章)、同步原语(第 10 章)。但 Embassy 远不止这些——它是一个完整的嵌入式开发生态系统。

生态架构图#

各组件的成熟度评估#

组件功能成熟度说明
embassy-executor异步运行时⭐⭐⭐⭐⭐生产就绪,API 稳定
embassy-time时间管理⭐⭐⭐⭐⭐生产就绪
embassy-sync同步原语⭐⭐⭐⭐⭐生产就绪
embassy-stm32STM32 HAL⭐⭐⭐⭐⭐覆盖最广,最成熟
embassy-nrfnRF HAL⭐⭐⭐⭐☆无线功能完善
embassy-rpRP2040/2350 HAL⭐⭐⭐⭐☆PIO 支持优秀
embassy-usbUSB 设备栈⭐⭐⭐⭐☆CDC/HID/MSC 可用
embassy-net网络协议栈⭐⭐⭐⭐☆TCP/UDP/DHCP/DNS 完善
embassy-bootBootloader⭐⭐⭐⭐☆A/B 分区方案成熟
troubleBLE 协议栈⭐⭐⭐☆☆快速发展中,尚未完全认证
embassy-embedded-hal适配层⭐⭐⭐⭐☆桥接 embedded-hal 生态
embassy-futures异步工具⭐⭐⭐⭐☆select/join 等组合子

C 工程师视角:如果把 Embassy 类比为 C 的生态,那么 embassy-executor ≈ FreeRTOS 内核,embassy-stm32 ≈ STM32 HAL 库,embassy-net ≈ LwIP,embassy-usb ≈ TinyUSB/STM32 USB 库。区别在于,Embassy 的所有组件共享同一个异步模型,天然协同工作。


11.2 embassy-usb:USB 设备栈#

是什么#

embassy-usb 是 Embassy 生态中的 USB 设备(Device)协议栈,完全用 Rust 编写,基于异步模型。它支持常见的 USB 设备类:

  • CDC-ACM(Communication Device Class - Abstract Control Model):虚拟串口,最常用的调试和通信方式
  • HID(Human Interface Device):键盘、鼠标、游戏手柄等
  • MSC(Mass Storage Class):U 盘模拟
  • 自定义类:通过实现 trait 创建任意 USB 设备

与 C 的 USB 库对比#

特性embassy-usbTinyUSB (C)STM32 USB 库 (C)
语言RustCC
异步支持原生 async/await回调/轮询中断回调
内存安全编译期保证手动管理手动管理
多类复合设备支持支持部分支持
平台支持STM32/nRF/RP2040/ESP32极广仅 STM32
学习曲线中等(需理解 async)中等较陡(CubeMX 依赖)

最小示例:USB CDC 回显#

这个示例将 STM32 变成一个 USB 虚拟串口设备,接收 PC 发来的数据并原样返回:

关键点解析

  1. Driver::new():绑定具体的 USB 外设和引脚,类型系统保证不会用错引脚
  2. CdcAcmClass::new():创建 CDC 类实例,自动处理 USB 描述符
  3. read_packet().await:异步等待数据到达,CPU 在等待期间可以执行其他任务
  4. usb_task:USB 协议栈的事件循环必须在独立任务中运行

与 C 的对比:在 C 中实现同样的功能,你需要手动配置 USB 描述符、处理中断回调、管理接收缓冲区。Embassy 将这些封装为类型安全的异步 API,编译器会阻止你犯”忘记初始化 USB 时钟”之类的错误。

去哪里深入#

  • 官方示例:embassy/examples/std/src/bin/usb_serial.rs
  • HID 示例:embassy/examples/nrf52840/src/bin/usb_hid_keyboard.rs
  • 文档:docs.embassy.dev/embassy-usb

11.3 embassy-net:网络协议栈#

是什么#

embassy-net 是 Embassy 生态的异步网络协议栈,底层基于 smoltcp(一个纯 Rust 的 TCP/IP 实现)。它提供了完全异步的网络 API:

支持的协议

  • IPv4 / IPv6
  • TCP / UDP
  • DHCP(自动获取 IP)
  • DNS(域名解析)
  • mDNS(本地网络服务发现)
  • ICMP(Ping)

支持的底层驱动

  • 以太网(STM32 ETH 外设、W5500 SPI 芯片等)
  • WiFi(通过 cyw43 驱动支持 RP2040 + CYW43439,通过 esp-wifi 支持 ESP32)

与 LwIP 的对比#

特性embassy-netLwIP (C)
语言RustC
编程模型async/await回调 / RAW API / Socket API
内存分配零堆分配(静态缓冲)可选静态或堆分配
线程安全编译期保证需要 SYS_LIGHTWEIGHT_PROT
协议完整性TCP/UDP/DHCP/DNS/mDNS更完整(含 PPP、SNMP 等)
代码体积较小(按需编译)可配置裁剪
生态集成与 Embassy 无缝集成需要 RTOS 或超级循环驱动

C 工程师的经验:如果你用过 LwIP 的 RAW API(基于回调),那么 embassy-net 的 async API 会让你感到如释重负——不再需要在回调中管理状态机,代码读起来就像顺序执行的逻辑。

最小示例:TCP Echo Server#

关键点解析

  1. StackResources<3>:泛型参数 3 表示最多同时打开 3 个 socket,编译期确定资源上限
  2. Config::dhcpv4():自动获取 IP,也支持 Config::ipv4_static() 手动配置
  3. stack.run().await:网络栈的事件循环,必须在独立任务中永远运行
  4. 零堆分配:所有缓冲区都是静态分配的 &mut [u8],没有 malloc

去哪里深入#

  • 官方示例:embassy/examples/stm32f4/src/bin/eth_tcp_echo.rs
  • WiFi 示例(RP2040):embassy/examples/rp/src/bin/wifi_tcp_echo.rs
  • smoltcp 文档:了解底层协议实现
  • embassy-net API 文档:docs.embassy.dev/embassy-net

11.4 embassy-boot:安全 Bootloader#

是什么#

embassy-boot 是一个轻量级的引导加载程序(Bootloader),专为嵌入式系统设计,核心功能是断电安全的固件 OTA 更新

核心特性

  • A/B 分区方案:两个固件槽位交替写入,更新失败可回滚
  • 断电保护:即使在写入过程中断电,设备也不会变砖
  • 固件回滚:新固件启动失败时自动回退到旧版本
  • 轻量级:代码体积极小,适合 Flash 有限的 MCU

OTA 更新的基本流程#

┌─────────────────────────────────────────────────────────┐
│                    Flash 布局                             │
├──────────┬──────────┬──────────┬────────────────────────┤
│Bootloader│  Slot A  │  Slot B  │     DFU 区域           │
│ (固定)   │ (活跃)   │ (备用)   │  (接收新固件)          │
└──────────┴──────────┴──────────┴────────────────────────┘

更新流程:
1. 应用通过 UART/USB/WiFi 接收新固件 → 写入 DFU 区域
2. 应用调用 embassy-boot API 标记"有待更新固件"
3. 设备重启 → Bootloader 检测到更新标记
4. Bootloader 将 DFU 区域的固件复制到 Slot B
5. Bootloader 交换 A/B 槽位,从新固件启动
6. 新固件启动成功 → 标记为"已确认"
7. 新固件启动失败(看门狗超时)→ 下次重启自动回滚到旧固件
plaintext

与 MCUboot 的对比#

特性embassy-bootMCUboot (C)
语言RustC
签名验证支持(ed25519)支持(RSA/ECDSA/ed25519)
加密传输支持支持
压缩支持支持
多镜像支持支持
与 Embassy 集成原生需要额外适配
代码体积更小较大(功能更全)
生态成熟度较新非常成熟(Zephyr 默认)

最小示例:应用端触发更新#

去哪里深入#

  • 官方示例:embassy/examples/bootloader/
  • 文档:docs.embassy.dev/embassy-boot
  • 完整 OTA 方案(含传输协议)需要结合 embassy-netembassy-usb 使用

11.5 蓝牙生态:troublenrf-softdevice#

蓝牙在 Embassy 生态中的位置#

蓝牙(特别是 BLE)是嵌入式无线通信的主流方案之一。Embassy 生态中有两种 BLE 方案:

trouble:Embassy 官方的 BLE 协议栈#

是什么trouble(原名 bleps)是一个纯 Rust 的 BLE Host 层实现,由 Embassy 团队维护。它的设计目标是:

  • 完全用 Rust 编写,无 C 代码依赖
  • 基于 bt-hci crate 与 BLE Controller 通信
  • 支持 L2CAP 面向连接的通道(CoC)
  • 支持 GATT(Generic Attribute Profile)
  • 未来目标:通过蓝牙 SIG 认证(Qualification)

当前状态(2026 年)

  • 支持 BLE 4.2 / 5.0 的核心功能
  • 广播、扫描、连接、GATT Server/Client 基本可用
  • L2CAP CoC 支持已实现
  • 尚未通过蓝牙 SIG 官方认证(产品使用需注意合规风险)
  • 主要验证平台:nRF52840、ESP32-C3/C6/S3

最小示例:BLE GATT Server(广播 + 自定义服务)

注意trouble 仍在快速迭代中,API 可能变化。请以 GitHub 仓库的最新示例为准。

nrf-softdevice:Nordic 芯片的 SoftDevice 绑定#

是什么nrf-softdevice 是 Nordic 官方 SoftDevice(预编译的 BLE 协议栈二进制)的 Rust 绑定。它不是纯 Rust 实现,而是通过 FFI 调用 Nordic 的 C 库。

特点

  • 功能完整:经过蓝牙 SIG 认证,可直接用于产品
  • 平台限制:仅支持 nRF52/nRF53 系列
  • 与 Embassy 集成:提供异步 API
  • 代价:SoftDevice 占用较多 Flash 和 RAM(约 150KB Flash + 8KB RAM)

选择建议

场景推荐方案
nRF 芯片 + 需要认证 + 产品级nrf-softdevice
nRF 芯片 + 学习/原型troublenrf-softdevice
ESP32 芯片 + BLEesp-ble(基于 ESP-IDF 的 NimBLE)
追求纯 Rust + 未来认证trouble(等待成熟)

去哪里深入#

  • trouble GitHub:github.com/embassy-rs/trouble
  • nrf-softdevice GitHub:github.com/embassy-rs/nrf-softdevice
  • 示例:nrf-softdevice/examples/src/bin/ble_gatt_server.rs

11.6 ESP32 与 esp-rs 生态#

乐鑫的 Rust 战略#

2025-2026 年,乐鑫(Espressif)将 Rust 提升为官方一等 SDK,与 C(ESP-IDF)并列。这意味着:

  • 乐鑫官方维护 Rust HAL(esp-hal
  • Embassy 被选为默认异步框架
  • 官方文档和示例同时提供 C 和 Rust 版本
  • WiFi/BLE 驱动有官方 Rust 绑定

esp-rs 生态组件#

┌─────────────────────────────────────────────────┐
│              esp-rs 生态全景                      │
├─────────────────────────────────────────────────┤
│  esp-hal        裸机 HAL(no_std)               │
│  esp-wifi       WiFi 驱动(async)               │
│  esp-ble        BLE 驱动(基于 NimBLE)          │
│  esp-alloc      堆分配器(可选)                  │
│  esp-println    日志输出                         │
│  esp-storage    Flash 存储抽象                   │
│  esp-backtrace  崩溃回溯                         │
├─────────────────────────────────────────────────┤
│  Embassy 集成                                    │
│  esp-hal 原生支持 Embassy executor               │
│  esp-wifi 提供 embassy-net 兼容驱动              │
└─────────────────────────────────────────────────┘
plaintext

支持的芯片#

芯片架构WiFiBLEEmbassy 支持
ESP32Xtensa LX6 双核2.4G4.2
ESP32-S2Xtensa LX7 单核2.4G
ESP32-S3Xtensa LX7 双核2.4G5.0
ESP32-C3RISC-V 单核2.4G5.0
ESP32-C6RISC-V 单核2.4G+5G5.0
ESP32-H2RISC-V 单核5.0 + 802.15.4

与 STM32 生态的成熟度对比#

维度STM32 (embassy-stm32)ESP32 (esp-hal)
HAL 覆盖度非常完整基本完整,部分外设缺失
文档质量优秀良好,快速改善中
示例数量非常丰富丰富
无线功能无(需外挂模块)原生 WiFi + BLE
工具链标准 Rust(ARM target)Xtensa 需 esp 工具链,RISC-V 用标准
社区活跃度非常高(乐鑫官方推动)

最小示例:ESP32-C3 + Embassy 点灯#

注意:ESP32 的 Xtensa 架构(ESP32/S2/S3)需要使用乐鑫维护的 Rust 工具链(esp channel),而 RISC-V 架构(C3/C6/H2)可以使用标准 Rust 工具链。这是 ESP32 生态与 STM32 生态的一个显著差异。

去哪里深入#

  • The Rust on ESP Book:esp-rs.github.io/book/
  • esp-hal 文档:docs.esp-rs.org/esp-hal/
  • 示例仓库:github.com/esp-rs/esp-hal/tree/main/examples
  • 乐鑫 Rust 论坛:github.com/esp-rs/esp-hal/discussions

11.7 真实世界项目案例#

开源项目推荐#

以下项目展示了 Embassy 在不同场景中的实际应用:

项目描述平台亮点
Embassy 官方示例覆盖所有外设和协议栈多平台最佳学习起点
probe-rs调试探针工具(部分嵌入式组件)-展示 Rust 工具链生态
ratatui终端 UI(非嵌入式,但展示 async 模式)-异步架构参考
esp-rs 示例集WiFi/BLE/USB 完整示例ESP32乐鑫官方维护
nrf-softdevice 示例BLE 完整应用nRF52产品级 BLE 参考

典型应用场景#

场景 1:IoT 传感器节点

传感器 → I2C/SPI 读取 → 数据处理 → WiFi/BLE 上报 → 低功耗睡眠
         (embassy HAL)   (async task)  (embassy-net)   (embassy-time)
plaintext

场景 2:USB 数据采集设备

ADC 采样 → DMA 传输 → 数据缓冲 → USB CDC 上传到 PC
(embassy HAL) (async)  (Channel)   (embassy-usb)
plaintext

场景 3:OTA 可更新的网关设备

以太网/WiFi → TCP 连接 → 接收固件 → 写入 Flash → 重启更新
(embassy-net)  (async)    (Channel)   (embassy-boot)
plaintext

从原型到产品的考量#

阶段关注点Embassy 生态支持
原型验证快速迭代、功能验证丰富的示例、async 简化开发
小批量稳定性、基本 OTAembassy-boot、defmt 日志
量产认证、安全、长期维护Ferrocene(安全认证)、签名验证
产品运维远程诊断、批量更新OTA + 日志 + 看门狗

11.8 社区资源与学习路径#

官方资源#

资源链接用途
Embassy GitHubgithub.com/embassy-rs/embassy源码、Issue、PR
Embassy 文档docs.embassy.devAPI 参考
Matrix 聊天室matrix.to/#/#embassy-rs:matrix.org实时问答(最活跃)
GitHub Discussions仓库内 Discussions 标签深度讨论
The Embedded Rust Bookdocs.rust-embedded.org/book/通用嵌入式 Rust 入门
The Rust on ESP Bookesp-rs.github.io/book/ESP32 Rust 开发

推荐的进阶学习顺序#

中文社区资源#

资源说明
Rust 嵌入式工作组翻译和维护中文文档
稀土掘金 / CSDN中文教程和实战文章
B 站Embassy 实战视频教程
知乎专栏深度技术分析
本书配套代码随书示例,逐步进阶

获取帮助的渠道#

  1. Matrix 聊天室(推荐):响应最快,核心开发者活跃
  2. GitHub Issues:报告 bug 或提出功能请求
  3. GitHub Discussions:提问和分享经验
  4. Stack Overflow:标记 [rust] + [embedded]

给 C 工程师的建议:不要害怕提问。Rust 嵌入式社区以友好著称,很多核心开发者自己就是从 C/C++ 转过来的,他们理解你的困惑。


11.9 Part 2 总结#

Part 2 知识图谱回顾#

从”会用 Embassy”到”理解 Embassy”的桥梁#

经过 Part 2 的学习,你已经能够:

  • ✅ 创建和配置 Embassy 工程
  • ✅ 使用异步 HAL 操作外设
  • ✅ 设计多任务架构
  • ✅ 选择合适的任务间通信方式
  • ✅ 了解 USB、网络、BLE、OTA 的可能性

但你可能还有这些疑问:

  • memory.x 里面每一行到底是什么意思?→ 第 12 章
  • 换一个芯片平台需要改什么?→ 第 13 章
  • 怎么让固件更小、跑得更快?→ 第 14 章
  • 除了 Embassy,还有什么库值得用?→ 第 15 章

这些问题的答案在 Part 3 等着你。

本章核心要点#

  1. Embassy 是一个完整的生态系统,不仅仅是异步运行时。它覆盖了从 HAL 到协议栈的完整链路。
  2. 各组件共享异步模型,天然协同工作。这是相比 C 生态(各库风格迥异)的最大优势。
  3. 生态成熟度不均匀:核心运行时和 STM32 HAL 已经生产就绪;BLE(trouble)仍在快速迭代中。
  4. ESP32 的加入极大地扩展了 Embassy 的应用范围,特别是 WiFi + BLE 的 IoT 场景。
  5. 社区活跃且友好,Matrix 聊天室是获取帮助的最佳渠道。

下一章预告:第 12 章将深入工具链的每一个环节——从 memory.x 的每一行含义,到 cortex-m-rt 的启动流程,再到 defmt 日志的工作原理。如果你曾经好奇”从 cargo build 到芯片运行之间到底发生了什么”,下一章会给你完整的答案。

Comment seems to stuck. Try to refresh?✨