aboutsummaryrefslogtreecommitdiff
path: root/src/macros.rs
diff options
context:
space:
mode:
authorGravatar bors[bot] <bors[bot]@users.noreply.github.com> 2018-05-11 17:58:13 +0000
committerGravatar bors[bot] <bors[bot]@users.noreply.github.com> 2018-05-11 17:58:13 +0000
commite3217ad94d6c941796c2d7ee8735e7b250a69387 (patch)
tree6488e7d0ad3910d30077f3fdd7eee553b1839f27 /src/macros.rs
parent00d6faae149c062e79a822b8d46b6b5e7e972f57 (diff)
parent05bbc3b815703a0654d2e37966547e392f856161 (diff)
downloadcortex-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.rs22
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;