diff options
author | 2018-05-11 17:58:13 +0000 | |
---|---|---|
committer | 2018-05-11 17:58:13 +0000 | |
commit | e3217ad94d6c941796c2d7ee8735e7b250a69387 (patch) | |
tree | 6488e7d0ad3910d30077f3fdd7eee553b1839f27 /src/macros.rs | |
parent | 00d6faae149c062e79a822b8d46b6b5e7e972f57 (diff) | |
parent | 05bbc3b815703a0654d2e37966547e392f856161 (diff) | |
download | cortex-m-e3217ad94d6c941796c2d7ee8735e7b250a69387.tar.gz cortex-m-e3217ad94d6c941796c2d7ee8735e7b250a69387.tar.zst cortex-m-e3217ad94d6c941796c2d7ee8735e7b250a69387.zip |
Merge #88
88: make compilable on stable r=japaric a=japaric
This PR makes this crate compilable on stable when the "inline-asm" and "singleton" Cargo features
are disabled (they are enabled by default to maintain backwards compatibility).
The main change has been replacing almost (\*) all inline `asm!` invocations with FFI calls into
external assembly files.
(\*) Stuff that has not been converted into external assembly file and thus is not available on
stable:
- Reading the (A)PSR register (I'm not sure if this will work with the extra function call overhead)
- Reading and writing the Link Register (LR)
- Reading and writing the Program Counter (PC)
I would appreciate if someone checked that all the stuff that's now using FFI calls has the same
semantics as the inline `asm!` version.
Co-authored-by: Jorge Aparicio <jorge@japaric.io>
Diffstat (limited to 'src/macros.rs')
-rw-r--r-- | src/macros.rs | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/src/macros.rs b/src/macros.rs index 7d2cf6a..e41cdc5 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -53,33 +53,29 @@ macro_rules! iprintln { macro_rules! singleton { (: $ty:ty = $expr:expr) => { $crate::interrupt::free(|_| { - static mut USED: bool = false; - static mut VAR: $crate::UntaggedOption<$ty> = $crate::UntaggedOption { none: () }; - + static mut VAR: Option<$ty> = None; #[allow(unsafe_code)] - let used = unsafe { USED }; + let used = unsafe { VAR.is_some() }; if used { None } else { - #[allow(unsafe_code)] - unsafe { USED = true } - let expr = $expr; #[allow(unsafe_code)] - unsafe { VAR.some = expr } + unsafe { + VAR = Some(expr) + } #[allow(unsafe_code)] - let var: &'static mut _ = unsafe { &mut VAR.some }; - - Some(var) + unsafe { + VAR.as_mut() + } } }) - } + }; } - /// ``` compile_fail /// #[macro_use(singleton)] /// extern crate cortex_m; |