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 嵌入式开发
10,347 每月下载量
用于 25 个crate (22 直接)
48KB
403 行
shared-bus
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 根据您的选择,许可采用以下任一许可证
- Apache License, Version 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
依赖关系
~70–255KB