embassy-stm32

Crates

git

Versions

stm32f439vg

Flavors

Skip to main content

PacketQueue

Struct PacketQueue 

Source
pub struct PacketQueue<const TX: usize, const RX: usize> { /* private fields */ }
Expand description

Ethernet descriptor rings.

This struct owns the DMA descriptors of the transmit and receive rings. The frames themselves live in embassy-net’s packet buffer pool: the receive ring holds one buffer per descriptor, filled by DMA in place, and the transmit ring holds each frame’s buffer until the hardware is done with it.

TX is the number of descriptors in the transmit ring, RX in the receive ring. A bigger ring allows the hardware to receive more frames while the CPU is busy doing other things, which may increase performance (especially for RX), at the cost of pinning more packet buffers. Make sure the packet pool (the packet-buf-count-N feature of xarxa) is bigger than TX + RX, with room to spare for the stack and sockets.

Implementations§

Source§

impl<const TX: usize, const RX: usize> PacketQueue<TX, RX>

Source

pub const fn new() -> Self

Create a new packet queue.

Source

pub fn init(this: &mut MaybeUninit<Self>)

Initialize a packet queue in-place.

This can be helpful to avoid accidentally stack-allocating the packet queue in the stack. The Rust compiler can sometimes be a bit dumb when working with large owned values: if you call new() and then store the returned PacketQueue in its final place (like a static), the compiler might place it temporarily on the stack then move it. Since this struct is quite big, it may result in a stack overflow.

With this function, you can create an uninitialized static with type MaybeUninit<PacketQueue<...>> and initialize it in-place, guaranteeing no stack usage.

After calling this function, calling assume_init on the MaybeUninit is guaranteed safe.

Auto Trait Implementations§

§

impl<const TX: usize, const RX: usize> !Freeze for PacketQueue<TX, RX>

§

impl<const TX: usize, const RX: usize> !RefUnwindSafe for PacketQueue<TX, RX>

§

impl<const TX: usize, const RX: usize> !Sync for PacketQueue<TX, RX>

§

impl<const TX: usize, const RX: usize> Send for PacketQueue<TX, RX>

§

impl<const TX: usize, const RX: usize> Unpin for PacketQueue<TX, RX>

§

impl<const TX: usize, const RX: usize> UnsafeUnpin for PacketQueue<TX, RX>

§

impl<const TX: usize, const RX: usize> UnwindSafe for PacketQueue<TX, RX>

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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.