diff options
Diffstat (limited to 'examples/big-struct-opt.rs')
-rw-r--r-- | examples/big-struct-opt.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/examples/big-struct-opt.rs b/examples/big-struct-opt.rs new file mode 100644 index 00000000..85ec5e61 --- /dev/null +++ b/examples/big-struct-opt.rs @@ -0,0 +1,48 @@ +//! examples/big-struct-opt.rs +//! +//! Example on how to initialize a large struct without needing to copy it via `LateResources`, +//! effectively saving stack space needed for the copies. + +#![no_main] +#![no_std] + +use panic_halt as _; + +/// Some big struct +pub struct BigStruct { + /// Big content + pub data: [u8; 2048], +} + +impl BigStruct { + fn new() -> Self { + BigStruct { data: [22; 2048] } + } +} + +#[rtic::app(device = lm3s6965)] +mod app { + use super::BigStruct; + use core::mem::MaybeUninit; + + #[resources] + struct Resources { + big_struct: &'static mut BigStruct, + } + + #[init] + fn init(_: init::Context) -> init::LateResources { + let big_struct = unsafe { + static mut BIG_STRUCT: MaybeUninit<BigStruct> = MaybeUninit::uninit(); + + // write directly into the static storage + BIG_STRUCT.as_mut_ptr().write(BigStruct::new()); + &mut *BIG_STRUCT.as_mut_ptr() + }; + + init::LateResources { + // assign the reference so we can use the resource + big_struct, + } + } +} |