#嵌入式设备 #平台 #io #async #外围设备 #spi-bus

no-std embedded-platform

提供一站式嵌入式设备支持

3 个版本

0.1.2 2020 年 1 月 6 日
0.1.1 2020 年 1 月 6 日
0.1.0 2020 年 1 月 6 日

#1755嵌入式开发

每月 27 次下载
用于 nrf52840-platform

MIT/Apache

40KB
726 代码行

嵌入式平台

注意:这是一个目前处于草图状态的库集,应被视为一个概念证明。

这定义了 embedded-platform 库集。想法是为基于 embedded-hal 的库添加设备和外围支持。这使得可以即插即用和混合搭配符合通用规范的库。例如,如果您有一个基于 nrf52840 的 MCU 以及一个基于 ili9341 的设备,并且它们都符合 Adafruit Feather 规范(引脚布局、电压级别等),您可以将它们连接起来,所有的布线工作都将为您完成。

目标是让 embedded-platform 成为 embedded-hal 的,就像 tokiomio 的一样。

已经做出的某些设计权衡

  • #![forbid(unsafe_code)];这属于 -pac-hal 库。
  • 不需要 alloc
  • 在启动时进行一些运行时兼容性检查,而不是在编译时,例如检查一个引脚只使用一次。事实证明,在编译时对设备寄存器进行细粒度所有者映射非常困难(这已经在 drone-os 中实现过),因此我们选择在运行时进行一些检查(例如,使用 Option::take)。这将在启动时浪费大约十多条指令,这是一次性成本。
  • 所有API都是异步优先的,这样代码就不会阻塞,我们可以更加高效地使用电力。这确实需要一个执行器,而且可以创建一个不需要 alloc 的执行器,但这还需要编写。
  • 该仓库使用自己的类似HAL的特质,例如 OutputPinI2cRead,以启用异步API并平滑处理 embedded_hal::gpio::v1embedded_hal::gpio::v2 等之间的不兼容性。
  • 所有平台仓库都应该维护在这个仓库中,以便可以同步进行像最后一点那样的更改。
  • 不要将中断暴露给用户。mypin.changes() 应该在引脚改变时返回一个异步的 futures::Stream。在后台,我们存储一个 Waker,该 Waker 从中断处理程序中被调用。

可以这样考虑预期的堆栈

┌─────────────────────────────────────────┐
│         Peripheral Access Crate         │
│            e.g. nrf52840-pac            │
├─────────────────────────────────────────┤
│        Hardware Abstraction Layer       │
│            e.g. nrf52840-hal            │
├─────────────────────────────────────────┤
│         Platform Implementation         │
│          e.g. nrf52840-platform         │
│ ┌─────────────────────────────────────┐ │
│ │          Specific Product           │ │
│ │         e.g. Particle Argon         │ │
│ ├─────────────────────────────────────┤ │
│ │            Common Spec              │ │
│ │        e.g. Adafruit Feather        │ │
│ │          or Arduino Shield          │ │
│ ├─────────────────────────────────────┤ │
│ │              Adapter                │ │
│ │        e.g. "Main SPI bus" on       │ │
│ │        specific Feather pins        │ │
│ └─────────────────────────────────────┘ │
├─────────────────────────────────────────┤
│              Device Driver              │
│              e.g. ili9341               │
└─────────────────────────────────────────┘

依赖项

~0.9–1.5MB
~32K SLoC