embassy
Rust 异步嵌入式框架,用 async/await 在 MCU 上实现安全高效的并发多任务
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Rust 异步嵌入式框架,用 async/await 在 MCU 上实现安全高效的并发多任务
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下:你手头有一个 STM32 微控制器,需要同时处理蓝牙通信、传感器数据采集、屏幕显示和低功耗待机。在传统嵌入式开发中,这些任务往往需要手动管理复杂的状态机和中断优先级,代码耦合度高,调试困难,维护成本极高。Embassy 框架的出现,就是为了解决这个痛点——它将 Rust 语言强大的内存安全保证和异步编程模型带入嵌入式领域,让开发者可以用写桌面应用一样优雅的方式,写出高效可靠的嵌入式代码。
嵌入式开发长期被两个问题困扰:一是传统 RTOS(实时操作系统)引入的内存开销和上下文切换成本;二是 C/C++ 中无处不在的内存安全问题。Rust 语言凭借其所有权系统和生命周期检查,在编译期就能消除空指针解引用、数据竞争等一大类 bug,但它在嵌入式场景的真正潜力,来自于 async/await 语法的引入。
Embassy 框架由 Rust 社区的嵌入式开发爱好者们发起,目标是成为「Rust 在嵌入式领域的标准异步运行时」。项目从 2020 年起步,逐步发展为覆盖 STM32、nRF52、RP2040 等主流 MCU 的完整生态,目前 GitHub 标星超过 9300,收获 1499 次 fork,700+ 个开放 issue,是嵌入式 Rust 领域最具影响力的项目之一。
Embassy 采用了高度模块化的 monorepo 结构,核心 crate 各自独立又互相依赖,构成了一个完整的嵌入式开发生态。
embassy-executor 是整个框架的调度核心。它实现了一个零分配、零栈开销的 async 任务调度器,将 async 函数在编译期自动转化为状态机,由单一线程或多个优先级线程执行。与传统 RTOS 不同,embassy-executor 不需要动态内存分配,所有任务在编译时就确定了资源占用,消除了运行时的内存不确定性。
embassy-sync 提供了嵌入式场景下的同步原语:Channel、Mutex、Semaphore 等。这些类型专门针对 no_std 环境设计,不依赖任何动态内存分配,适合内存受限的嵌入式平台。相比标准库的同步原语,embassy-sync 在 ISR(中断服务例程)和线程上下文之间提供了统一的安全接口。
embassy-time 是最受欢迎的功能之一。它提供了全局可用的 Instant、Duration 和 Timer 类型,彻底告别了手动配置硬件定时器的繁琐。Timer::after_millis(100).await 这样简洁的写法,背后是框架自动管理硬件定时器资源的智能调度,开发者无需关心底层细节。
embassy-net 实现了一个完整的异步网络协议栈,支持 Ethernet、IP、TCP、UDP、ICMP 和 DHCP。协议栈完全用 Rust 实现,不依赖任何外部 C 库,可通过 smoltcp 底层驱动在各类 MCU 上运行。对于需要网络连接的 IoT 设备,这是目前最成熟的嵌入式 Rust 网络方案。
embassy-usb 提供了设备端 USB 协议栈,支持 CDC ACM(虚拟串口)、HID 等常见类。一个典型的 USB 虚拟串口实现只需几十行代码,大幅降低了 USB 开发的门槛。
embassy-boot 是一个轻量级 bootloader,支持固件的安全升级、回滚和试启动(trial boot)机制,对于需要 OTA 更新的 IoT 设备至关重要。
Embassy 对硬件的支持覆盖面极广,这是它区别于其他嵌入式框架的核心优势之一。通过 embassy-stm32 支持全部 STM32 微控制器系列,embassy-nrf 覆盖 Nordic 全系蓝牙芯片(nRF52/nRF53/nRF54/nRF91),embassy-rp 支持树莓派 RP2040 和 RP235x,embassy-mspm0 覆盖 TI MSPM0 系列,embassy-mcxa 支持 NXP MCX-A 系列。此外,社区还维护着 esp-rs(ESP32 系列)、ch32-hal(国产 CH32V 系列)等第三方 HAL 适配。
这种「官方维护核心生态 + 社区扩展硬件支持」的模式,使 Embassy 成为了一个真正可持续发展的嵌入式框架,而非局限于某一芯片厂商的专有方案。
Embassy 的开发流程非常友好。开发者首先在 probe.rs 安装烧录工具,然后 git clone 示例代码,修改 .cargo/config.toml 中的目标芯片名称,运行 cargo run --release --bin <example> 即可将程序烧录到开发板上。整个过程无需复杂的 IDE 配置,VS Code + rust-analyzer 可以直接使用(项目提供了 .vscode/settings.json 中的 rust-analyzer.linkedProjects 配置)。
项目还提供了 examples/std 目录下的 PC 端模拟示例,可以在没有真实硬件的情况下验证代码逻辑,这对测试驱动开发(TDD)非常有帮助。
低功耗是 Embassy 最令人印象深刻的设计亮点之一。传统 RTOS 在没有任务执行时,往往需要忙等待(busy-wait)或者复杂的手动 tickless 配置。而 Embassy 的 async executor 在没有任何就绪任务时,会自动让 CPU 进入睡眠状态,任务通过外部中断唤醒。这种「事件驱动」的睡眠机制,可以将设备功耗降低到微安级别,对于电池供电的 IoT 设备意义重大。
尽管 Embassy 在技术上非常出色,但它并非没有局限。首先,它要求 Rust nightly 编译器(embassy-rs 本身维护着 rust-toolchain 配置),虽然 README 声称「保证在 stable 上编译」,但 nightly 特性(如 embedded-async-io)的依赖可能带来版本漂移风险。其次,Rust async 在嵌入式场景的生态仍处于快速发展期,部分外设驱动的成熟度不如 C 生态的 HAL(如 STM32 HAL)。此外,对于完全没有 Rust 背景的嵌入式工程师,学习曲线不可忽视。
Embassy 的出现标志着嵌入式开发从「裸机 C / RTOS + C++」向「安全 Rust + async」的重大迁移。它证明了在资源受限的嵌入式平台上,async/await 不仅可行,而且可以带来实质性的开发效率提升和安全性改进。随着 Rust 在嵌入式领域的持续深耕,Embassy 很可能成为未来 IoT 设备开发的事实标准框架之一。对于任何关注嵌入式系统、AIoT 硬件开发的开发者而言,关注并学习 Embassy 是一个值得的投资。