diff --git a/embassy-stm32/src/eth/mod.rs b/embassy-stm32/src/eth/mod.rs index 9f62b61e..9b500bfd 100644 --- a/embassy-stm32/src/eth/mod.rs +++ b/embassy-stm32/src/eth/mod.rs @@ -39,6 +39,24 @@ impl PacketQueue { rx_buf: [Packet([0; RX_BUFFER_SIZE]); RX], } } + + // Allow to initialize a Self without requiring it to go on the stack + #[cfg(feature = "nightly")] + pub const unsafe fn init(this: &mut core::mem::MaybeUninit) { + let this: &mut Self = unsafe { this.assume_init_mut() }; + let mut i = 0; + while i < TX { + this.tx_desc[i] = TDes::new(); + this.tx_buf[i] = Packet([0; TX_BUFFER_SIZE]); + i += 1; + } + i = 0; + while i < RX { + this.rx_desc[i] = RDes::new(); + this.rx_buf[i] = Packet([0; RX_BUFFER_SIZE]); + i += 1; + } + } } static WAKER: AtomicWaker = AtomicWaker::new(); diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index eeaa04f6..7c0b2d51 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs @@ -1,7 +1,13 @@ #![no_std] #![cfg_attr( feature = "nightly", - feature(type_alias_impl_trait, async_fn_in_trait, impl_trait_projections) + feature( + type_alias_impl_trait, + async_fn_in_trait, + impl_trait_projections, + const_mut_refs, + const_maybe_uninit_assume_init + ) )] #![cfg_attr(feature = "nightly", allow(incomplete_features))]