Skip to main content

DmaRxStreamBuf

Struct DmaRxStreamBuf 

Source
pub struct DmaRxStreamBuf { /* private fields */ }
Available on crate feature unstable only.
Expand description

DMA Streaming Receive Buffer.

This is a contiguous buffer linked together by DMA descriptors, and the buffer is evenly distributed between each descriptor provided.

It is used for continuously streaming data from a peripheral’s FIFO.

It maintains a sliding window of descriptors that progresses when DmaRxStreamBufView::consume is called.

The list starts out like so A (empty) -> B (empty) -> C (empty) -> D (empty) -> NULL.

As the DMA writes to the buffers the list progresses like so:

  • A (empty) -> B (empty) -> C (empty) -> D (empty) -> NULL
  • A (full) -> B (empty) -> C (empty) -> D (empty) -> NULL
  • A (full) -> B (full) -> C (empty) -> D (empty) -> NULL
  • A (full) -> B (full) -> C (full) -> D (empty) -> NULL

As DmaRxStreamBufView::consume is called, the list (approximately) progresses like so:

  • A (full) -> B (full) -> C (full) -> D (empty) -> NULL
  • B (full) -> C (full) -> D (empty) -> A (empty) -> NULL
  • C (full) -> D (empty) -> A (empty) -> B (empty) -> NULL
  • D (empty) -> A (empty) -> B (empty) -> C (empty) -> NULL

If all the descriptors fill up, the DmaRxInterrupt::DescriptorEmpty interrupt fires and the DMA stops writing. The transfer must then be resumed or restarted.

This buffer does not indicate when this condition occurs. Check with the driver to see if the DMA has stopped.

When constructing this buffer, tune the ratio between the chunk size and buffer size appropriately. Smaller chunk sizes mean data is received more frequently, but the DMA interrupts (DmaRxInterrupt::Done) also fire more frequently when they are used.

See DmaRxStreamBufView for APIs available while a transfer is in progress.

Implementations§

Source§

impl DmaRxStreamBuf

Source

pub fn new( descriptors: DmaAlignedMut<'static, [DmaDescriptor]>, buffer: DmaAlignedMut<'static, [u8]>, ) -> Result<Self, DmaBufError>

Creates a new DmaRxStreamBuf evenly distributing the buffer between the provided descriptors.

Source

pub fn split( self, ) -> (DmaAlignedMut<'static, [DmaDescriptor]>, DmaAlignedMut<'static, [u8]>)

Consumes the buf, returning the descriptors and buffer.

Trait Implementations§

Source§

impl Debug for DmaRxStreamBuf

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DmaRxBuffer for DmaRxStreamBuf

Source§

type View = DmaRxStreamBufView

A type providing operations that are safe to perform on the buffer while the DMA is actively using it.
Source§

type Final = DmaRxStreamBuf

The type returned when a transfer finishes. Read more
Source§

fn prepare(&mut self) -> Preparation

Prepares the buffer for an imminent transfer and returns information required to use this buffer. Read more
Source§

fn into_view(self) -> DmaRxStreamBufView

This is called before the DMA starts using the buffer.
Source§

fn from_view(view: Self::View) -> Self

This is called after the DMA is done using the buffer.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.