Embassy文档-开始

  • 2023年 11月7日
  • 读完约需 5 分钟
  • • 
  • 标签: 
  • embassy
  • rust
  • async
  • 最后更新于 2023年 11月7日

Embassy

在嵌入式开发中,Embassy 的作用是让 async/await 成为首选的实现方式。

什么是异步?

不支持异步的程序,可能会在进行I/O相关操作时被阻塞。在通常的环境中,比如PC, 软件可以通过非阻塞操作或线程的方式来解决阻塞的问题。线程的方式是,当某个线程在I/O操作上被阻塞时,系统能切换到另一个线程继续执行。然而即使在PC上,线程也相对较重,因此一些编程语言实现了一个称为协程或goroutines(Go语言)的概念,它们比线程轻得多,强度也低得多。另一种处理阻塞I/O操作的方式是:轮询底层外围设备的状态,检查它是否可以响应执行请求,在没有内置异步支持的编程语言中,这往往需要构建一个复杂的循环检查事件。

在Rust中,非阻塞操作可以通过async/await来实现。Async-wait将async函数传入一个叫做future的对象,当future对象被I/O操作阻塞时,调度器(通常称为执行器,executor)将选择其他future对象来执行。执行器不需要检测future对象什么时候能执行,所以相对RTOS等方案而言,async有更好的切换性能和更低的消耗,但程序大小通常会比非异步程序更大。这在资源有限,比如内存很少的设备环境中可能是个问题。在Embassy支持的设备,比如stm32和nrf中,内存通常足以容纳规模适度的程序运行。

Embassy是什么?

Embassy项目包含以下crate,它们可以自由组合使用,没有任何限制。

  • 执行器 embassy-executor是一个异步执行器。它在启动时分配固定的任务数,同时允许后续添加。对于支持硬件抽象层(HAL)的硬件,比如USART, UART, I2C, SPI, CAN, 和USB等,Embassy同时提供了支持同步和异步的版本。像直接内存访问(DMA)这样的场景适合使用异步接口,GPIO则更适合使用同步接口。执行器还提供了定时器功能,可以方便地实现同步或异步的延迟。对于小于一微秒的延迟要求,建议使用阻塞延迟,因为上下文切换的成本太高,执行器将无法提供准确的定时。

  • 硬件抽象层(HAL) HAL提供了安全易用的接口来操作硬件,不需要操作原始寄存器。Embassy维护了下列硬件的HAL,但它并不局限于此,您可以在任何使用Embassy的项目中使用HAL。

    • embassy-stm32 支持STM32微控制器系列
    • emmbassy-nrf 支持北欧半导体公司(the Nordic Semiconducotr)的nRF52、nRF53、nRF91系列
  • 网络 embassy-net实现了常用的网络功能,包括以太网、IP、TCP、UDP、ICMP和DHCP。在管理超时和同时为多个连接提供服务方面,Async做了高度简化,提供了很大的便利。

  • 蓝牙 nrf-softdevice为nRF52微控制器提供蓝牙低能耗4.x和5.x支持。

  • LoRa embassy-lora支持STM32WL无线微控制器和Semtech SX127x收发器上的LoRa网络。

  • USB embassy-usb实现了设备侧的USB堆栈。实现了通用类(如USB串行(CDC ACM),支持USB HID,并且提供丰富的构建器API方便构建您自己的实现。

  • Bootloader和DFU embassy-boot是一个轻量级的启动器,它支持固件加载,支持以电源故障安全的方式升级固件,支持试用引导和回滚。