2个版本
0.1.2 | 2020年1月6日 |
---|---|
0.1.1 | 2020年1月6日 |
#2116 in 嵌入式开发
56KB
1K SLoC
embedded-platform
注意:这目前是一套正在进行的草稿库,应被视为一个概念验证。
这定义了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
的执行器。我为cortex-m设备在 core 中创建了一个,与direct-executor
包一起。 - 该包使用自有的HAL-like traits,例如
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 │
└─────────────────────────────────────────┘
依赖项
~8.5MB
~232K SLoC