macro_rules! singleton {
($(#[$meta:meta])* $name:ident: $ty:ty = $expr:expr) => { ... };
($(#[$meta:meta])* : $ty:ty = $expr:expr) => { ... };
}Expand description
Macro to create a mutable reference to a statically allocated value
This macro returns a value with type Option<&'static mut $ty>. Some($expr) will be returned
the first time the macro is executed; further calls will return None. To avoid unwrapping a
None variant the caller must ensure that the macro is called from a function that’s executed
at most once in the whole lifetime of the program.
§Notes
This macro requires a critical-section implementation to be set. For most single core systems,
you can enable the critical-section-single-core feature for this crate. For other systems, you
have to provide one from elsewhere, typically your chip’s HAL crate.
For debuggability, you can set an explicit name for a singleton. This name only shows up the debugger and is not referenceable from other code. See example below.
§Example
use cortex_m::singleton;
fn main() {
// OK if `main` is executed only once
let x: &'static mut bool = singleton!(: bool = false).unwrap();
let y = alias();
// BAD this second call to `alias` will definitively `panic!`
let y_alias = alias();
}
fn alias() -> &'static mut bool {
singleton!(: bool = false).unwrap()
}
fn singleton_with_name() {
// A name only for debugging purposes
singleton!(FOO_BUFFER: [u8; 1024] = [0u8; 1024]);
}