3 个版本
0.1.2 | 2020 年 1 月 6 日 |
---|---|
0.1.1 | 2020 年 1 月 6 日 |
0.1.0 | 2020 年 1 月 6 日 |
#1755 在 嵌入式开发
每月 27 次下载
用于 nrf52840-platform
40KB
726 代码行
嵌入式平台
注意:这是一个目前处于草图状态的库集,应被视为一个概念证明。
这定义了 embedded-platform
库集。想法是为基于 embedded-hal
的库添加设备和外围支持。这使得可以即插即用和混合搭配符合通用规范的库。例如,如果您有一个基于 nrf52840
的 MCU 以及一个基于 ili9341
的设备,并且它们都符合 Adafruit Feather 规范(引脚布局、电压级别等),您可以将它们连接起来,所有的布线工作都将为您完成。
目标是让 embedded-platform
成为 embedded-hal
的,就像 tokio
是 mio
的一样。
已经做出的某些设计权衡
#![forbid(unsafe_code)]
;这属于-pac
或-hal
库。- 不需要
alloc
。 - 在启动时进行一些运行时兼容性检查,而不是在编译时,例如检查一个引脚只使用一次。事实证明,在编译时对设备寄存器进行细粒度所有者映射非常困难(这已经在
drone-os
中实现过),因此我们选择在运行时进行一些检查(例如,使用Option::take
)。这将在启动时浪费大约十多条指令,这是一次性成本。 - 所有API都是异步优先的,这样代码就不会阻塞,我们可以更加高效地使用电力。这确实需要一个执行器,而且可以创建一个不需要
alloc
的执行器,但这还需要编写。 - 该仓库使用自己的类似HAL的特质,例如
OutputPin
或I2cRead
,以启用异步API并平滑处理embedded_hal::gpio::v1
和embedded_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