在 AVR (no_std) Rust 中共享对资源的锁定引用的正确方法是什么?

Mut*_*Bob 5 rust

我有两个需要使用 SPI 总线的设备驱动程序。

幸运的是,想要“拥有”它的人使用一种特征,并且我可以插入我自己的实现。

如果这是常规的 RustArc<Mutex<SPI>>就足够了,但我遇到了挑战。


extern crate alloc;

use alloc::sync::Arc;
use avr_hal_generic::avr_device::interrupt::{CriticalSection, Mutex};

...

let spi = Arc::new(Mutex::new(spi));
let device_interface = SpiWorkaround::new(spi.clone(), cs, dc);
Run Code Online (Sandbox Code Playgroud)

当我尝试在基于https://github.com/Rahix/avr-hal-template的项目中编译它时,我得到

error[E0463]: can't find crate for `alloc`
 --> src/main.rs:5:1
  |
5 | extern crate alloc;
  | ^^^^^^^^^^^^^^^^^^^ can't find crate
Run Code Online (Sandbox Code Playgroud)

如果我添加alloc="*"Cargo.toml我得到

error: no matching package named `alloc` found
location searched: registry `crates-io`
Run Code Online (Sandbox Code Playgroud)

我能够使用这些来克服这些cargo build --release -Z build-std=core,alloc(有没有办法将其放入Cargo.toml?)并收到此错误:

error[E0432]: unresolved import `alloc::sync`
 --> src/main.rs:7:12
  |
7 | use alloc::sync::Arc;
  |            ^^^^ could not find `sync` in `alloc`
Run Code Online (Sandbox Code Playgroud)

在 no_std AVR 环境中让两个数据结构轮流使用一个对象的正确技术是什么?

Cha*_*man 3

你不能用于Arc此目的。Arc使用原子usize作为其引用计数器,因此仅支持具有usize-size 原子的目标。不幸的是,您的平台的大小usize是 16 位,但它最多只支持 8 位原子。

您可以从 std 复制源代码并对其进行修改以Arc代替使用(可能已经有一个板条箱,但我没有找到)。请注意,这仅支持最多 255 个活跃所有者。AtomicU8AtomicUsize

至于另一个问题,你可以按如下方式放置change key,以避免每次都.cargo/config.toml [build-std]需要通过:-Zbuild-std

[unstable]
build-std = ["core", "alloc"]
Run Code Online (Sandbox Code Playgroud)