macro_rules! singleton { (: $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 unwrap
ping 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.
§Note
This macro requires a critical-section
implementation to be set. For most single-hart systems,
you can enable the critical-section-single-hart
feature for this crate. For other systems, you
have to provide one from elsewhere, typically your chip’s HAL crate.
§Example
use riscv::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()
}