From e8eca4be37a2fe1af25b203ace5e99b31fcc3972 Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Thu, 22 Oct 2020 21:36:32 +0200 Subject: Now all locks are symmetric Test fixes Fix test Fix comment --- examples/big-struct-opt.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 examples/big-struct-opt.rs (limited to 'examples/big-struct-opt.rs') 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 = 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, + } + } +} -- cgit v1.2.3