14个版本

0.3.1 2023年10月31日
0.2.5 2022年11月22日
0.2.4 2022年6月16日
0.2.3 2022年3月5日
0.1.4 2018年11月4日

#86 in 嵌入式开发

Download history 3268/week @ 2024-04-15 3841/week @ 2024-04-22 3588/week @ 2024-04-29 2312/week @ 2024-05-06 2412/week @ 2024-05-13 2790/week @ 2024-05-20 2678/week @ 2024-05-27 1771/week @ 2024-06-03 2927/week @ 2024-06-10 2376/week @ 2024-06-17 1859/week @ 2024-06-24 3068/week @ 2024-07-01 2737/week @ 2024-07-08 2508/week @ 2024-07-15 2699/week @ 2024-07-22 2281/week @ 2024-07-29

10,347 每月下载量
用于 25 个crate (22 直接)

MIT/Apache

48KB
403

shared-bus crates.io页面 docs.rs 持续集成

shared-bus 是一个crate,允许在多个设备之间安全地共享总线外设。

embedded-hal 生态系统内,驱动通常“拥有”它们正在操作的总线外设。这意味着只有一个驱动可以访问某个总线。当多个设备连接到单个总线时,这显然会引发问题。

shared-bus 通过为每个驱动提供总线代理来解决此问题,该代理内部以安全的方式管理对实际总线的访问。要深入了解这个crate试图解决的问题,请参阅博客文章

根据不同用例有不同的'总线管理器'

单个任务/线程内的共享

只要一个总线所有用户都包含在单个任务/线程中,总线共享就非常简单。由于没有并发,不需要特殊同步。这就是使用BusManagerSimple的地方

// For example:
let i2c = I2c::i2c1(dp.I2C1, (scl, sda), 90.khz(), clocks, &mut rcc.apb1);

let bus = shared_bus::BusManagerSimple::new(i2c);

let mut proxy1 = bus.acquire_i2c();
let mut my_device = MyDevice::new(bus.acquire_i2c());

proxy1.write(0x39, &[0xc0, 0xff, 0xee]);
my_device.do_something_on_the_bus();

可以多次调用 BusManager::acquire_*() 方法;每次调用都将产生一个新的请求类型的新总线代理。

多个任务/线程间的共享

在多个任务/线程之间共享时,需要同步来确保所有总线访问都是严格序列化的,并且不能相互竞争。这种同步由平台特定的 BusMutex 实现。 shared-bus 已经包含了一些常见目标的实现。对于每个实现,都有一个宏,可以轻松创建具有 'static 生命周期的总线管理器,这在跨任务/线程边界共享时几乎总是必需的。例如

// For example:
let i2c = I2c::i2c1(dp.I2C1, (scl, sda), 90.khz(), clocks, &mut rcc.apb1);

// The bus is a 'static reference -> it lives forever and references can be
// shared with other threads.
let bus: &'static _ = shared_bus::new_std!(SomeI2cBus = i2c).unwrap();

let mut proxy1 = bus.acquire_i2c();
let mut my_device = MyDevice::new(bus.acquire_i2c());

// We can easily move a proxy to another thread:
# let t =
std::thread::spawn(move || {
    my_device.do_something_on_the_bus();
});
# t.join().unwrap();

这些平台特定的部分受到一个需要启用的功能的保护。以下是现有功能的概述

互斥锁 总线管理器 'static 总线宏 特性名称
std::sync::互斥锁 BusManagerStd new_std!() std
cortex_m::interrupt::互斥锁 BusManagerCortexM new_cortexm!() cortex-m
shared_bus::XtensaMutex (在关键部分中的 spin::Mutex BusManagerXtensa  new_xtensa!() xtensa
NA BusManagerAtomicCheck new_atomic_check!() cortex-m

支持的总线

目前,以下总线可以通过 shared-bus 进行共享

总线 代理类型 获取方法 注释
I2C I2cProxy .acquire_i2c()
SPI SpiProxy .acquire_spi() SPI只能在单个任务内共享(详见 SpiProxy)。
ADC AdcProxy .acquire_adc()

许可证

shared-bus 根据您的选择,许可采用以下任一许可证

依赖关系

~70–255KB