Type Alias shared_bus::BusManagerAtomicCheck
source · pub type BusManagerAtomicCheck<T> = BusManager<AtomicCheckMutex<T>>;
Expand description
A bus manager for safely sharing the bus when using concurrency frameworks (such as RTIC).
This manager relies on RTIC or some other concurrency framework to manage resource contention automatically. As a redundancy, this manager uses an atomic boolean to check whether or not a resource is currently in use. This is purely used as a fail-safe against misuse.
Warning
If devices on the same shared bus are not treated as a singular resource, it is possible that pre-emption may occur. In this case, the manger will panic to prevent the race condition.
Usage
In order to use this manager with a concurrency framework such as RTIC, all devices on the shared bus must be stored in the same logic resource. The concurrency framework will require a resource lock if pre-emption is possible.
In order to use this with RTIC (as an example), all devices on the shared bus must be stored in
a singular resource. Additionally, a manager with 'static
lifetime is needed which can be
created using the shared_bus::new_atomic_check!()
macro. It should
roughly look like this (there is also a full example available):
struct Device<T> { bus: T };
struct OtherDevice<T> { bus: T };
// the HAL I2C driver type
type I2cType = ();
type Proxy = shared_bus::I2cProxy<'static, shared_bus::AtomicCheckMutex<I2cType>>;
struct SharedBusDevices {
device: Device<Proxy>,
other_device: OtherDevice<Proxy>,
}
struct Resources {
shared_bus_devices: SharedBusDevices,
}
// in the RTIC init function
fn init() -> Resources {
// init the bus like usual
let i2c: I2cType = ();
let bus_manager: &'static _ = shared_bus::new_atomic_check!(I2cType = i2c).unwrap();
let devices = SharedBusDevices {
device: Device { bus: bus_manager.acquire_i2c() },
other_device: OtherDevice { bus: bus_manager.acquire_i2c() },
};
Resources {
shared_bus_devices: devices,
}
}
This type is only available with the cortex-m
feature (but this may change in the future!).
Aliased Type§
struct BusManagerAtomicCheck<T> { /* private fields */ }