项目结构

esp-rs Crate

不像大多数其他嵌入式平台,Espressif 支持 Rust 标准库。其中最值得关注的是,你可以任意使用大小可变的集合,例如 VecHashMap,以及基于 Box 的通用堆存储。你还可以自由地创建新线程,并使用 ArcMutex 等同步原语在它们之间安全地共享数据。 尽管如此,内存在嵌入式系统上仍然是一种稀缺资源,因此需要注意不要耗尽它——尤其是,使用线程的代价可能会很高。

Espressif 的开源物联网开发框架 ESP-IDF 提供了 Wi-Fi、HTTP 客户端/服务器、MQTT、OTA 更新、日志记录等服务。esp-idf 主要是用 C 编写的,因此将它以规范的、分离的 crate 的形式提供给 Rust:

  • 一个 sys crate 提供了实际的 unsafe 绑定(esp-idf-sys
  • 一个高级的 crate 提供了安全易用的 Rust 抽象(esp-idf-svc

最后一部分是底层硬件访问,仍以分离的形式提供:

  • esp-idf-hal 实现了硬件无关的 embedded-hal traits,例如模数转换、数字 I/O 引脚、SPI 通信。正如它的名字所暗示的,它依赖于 ESP-IDF。
  • 如果需要直接操作寄存器,esp32c3 提供由 svd2rust 生成的外设访问 crate。

Rust on ESP Book 的 ecosystem 章节 提供了更多信息。

构建工具链

🔎 作为项目构建的一部分,esp-idf-sys 会下载基于 C 的 Espressif 工具链 ESP-IDF。下载位置是可配置的,为了节省硬盘空间和下载时间,本教程中的所有示例和练习都被设置为使用一个单一的全局工具链,安装在 ~/.espressif 中(对于 Windows,是%USERPROFILE%\.espressif)。 关于其他可选的配置,请参阅 esp-idf-sysREADME 中的 ESP_IDF_TOOLS_INSTALL_DIR 参数。

Package 布局

与使用 cargo new 创建的常规 Rust 项目相比,我们还需要一些额外的文件和参数。本教程中的示例和练习都已经配置好,要创建新项目,建议使用基于 cargo-generate 向导的方法。

🔎 本页的其余部分是可选知识,在你希望更改项目的某些方面时可以派上用场。

必须设置一些构建依赖项

[build-dependencies]
embuild = "=0.31.2"
anyhow = "=1.0.71"

额外的配置文件

  • build.rs - Cargo 构建脚本。这里设置构建所需的环境变量。
  • .cargo/config.toml - 设置目标架构、自定义 runner 来烧写和监视设备、控制构建细节。如果有需要的话,可以在此处覆盖 ESP_IDF_TOOLS_INSTALL_DIR
  • sdkconfig.defaults - 覆盖 ESP-IDF 的特定参数,例如堆栈大小、日志级别等。