#platform #embedded-devices #async #nrf52 #io

no-std nrf52840-platform

以包含电池的方式为基于nrf52840的设备提供全面的嵌入式设备支持

2个版本

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

#2116 in 嵌入式开发

MIT/Apache

56KB
1K SLoC

embedded-platform

注意:这目前是一套正在进行的草稿库,应被视为一个概念验证。

这定义了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 的执行器。我为cortex-m设备在 core 中创建了一个,与 direct-executor 包一起。
  • 该包使用自有的HAL-like traits,例如 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               │
└─────────────────────────────────────────┘

依赖项

~8.5MB
~232K SLoC