pub struct PeripheralRef<'a, T> { /* private fields */ }Expand description
An exclusive reference to a peripheral.
This is functionally the same as a &'a mut T. There’s a few advantages in having
a dedicated struct instead:
- Memory efficiency: Peripheral singletons are typically either zero-sized (for concrete
peripherals like
PA9orSPI4) or very small (for exampleAnyPin, which is 1 byte). However&mut Tis always 4 bytes for 32-bit targets, even if T is zero-sized. PeripheralRef stores a copy ofTinstead, so it’s the same size. - Code size efficiency. If the user uses the same driver with both
SPI4and&mut SPI4, the driver code would be monomorphized two times. With PeripheralRef, the driver is generic over a lifetime only.SPI4becomesPeripheralRef<'static, SPI4>, and&mut SPI4becomesPeripheralRef<'a, SPI4>. Lifetimes don’t cause monomorphization.
Implementations§
Source§impl<'a, T> PeripheralRef<'a, T>
impl<'a, T> PeripheralRef<'a, T>
Sourcepub fn new(inner: T) -> PeripheralRef<'a, T>
pub fn new(inner: T) -> PeripheralRef<'a, T>
Create a new reference to a peripheral.
Sourcepub unsafe fn clone_unchecked(&self) -> PeripheralRef<'a, T>where
T: Peripheral<P = T>,
pub unsafe fn clone_unchecked(&self) -> PeripheralRef<'a, T>where
T: Peripheral<P = T>,
Unsafely clone (duplicate) a peripheral singleton.
§Safety
This returns an owned clone of the peripheral. You must manually ensure
only one copy of the peripheral is in use at a time. For example, don’t
create two SPI drivers on SPI1, because they will “fight” each other.
You should strongly prefer using reborrow() instead. It returns a
PeripheralRef that borrows self, which allows the borrow checker
to enforce this at compile time.
Sourcepub fn reborrow(&mut self) -> PeripheralRef<'_, T>where
T: Peripheral<P = T>,
pub fn reborrow(&mut self) -> PeripheralRef<'_, T>where
T: Peripheral<P = T>,
Reborrow into a “child” PeripheralRef.
self will stay borrowed until the child PeripheralRef is dropped.
Sourcepub fn map_into<U>(self) -> PeripheralRef<'a, U>where
T: Into<U>,
pub fn map_into<U>(self) -> PeripheralRef<'a, U>where
T: Into<U>,
Map the inner peripheral using Into.
This converts from PeripheralRef<'a, T> to PeripheralRef<'a, U>, using an
Into impl to convert from T to U.
For example, this can be useful to degrade GPIO pins: converting from PeripheralRef<’a, PB11>toPeripheralRef<’a, AnyPin>`.