aboutsummaryrefslogtreecommitdiff
path: root/src/asm.rs
diff options
context:
space:
mode:
authorGravatar Jorge Aparicio <japaricious@gmail.com> 2017-03-04 20:46:19 -0500
committerGravatar Jorge Aparicio <japaricious@gmail.com> 2017-03-04 20:46:19 -0500
commit251d1aa11244d5356659ccf969e29b0e7da82c7a (patch)
treec586f652b45b6981c3aa15ea870643763d7dbc35 /src/asm.rs
parentb4f105cde28d89f3c8e42e4fe341390a7dc2dccf (diff)
downloadcortex-m-251d1aa11244d5356659ccf969e29b0e7da82c7a.tar.gz
cortex-m-251d1aa11244d5356659ccf969e29b0e7da82c7a.tar.zst
cortex-m-251d1aa11244d5356659ccf969e29b0e7da82c7a.zip
review safety of the existing API, make the register API type safe
Diffstat (limited to 'src/asm.rs')
-rw-r--r--src/asm.rs64
1 files changed, 46 insertions, 18 deletions
diff --git a/src/asm.rs b/src/asm.rs
index 2e3368a..b94d4ef 100644
--- a/src/asm.rs
+++ b/src/asm.rs
@@ -1,58 +1,86 @@
//! Miscellaneous assembly instructions
-/// Puts the processor in Debug state. Debuggers can pick this up as a "breakpoint".
+/// Puts the processor in Debug state. Debuggers can pick this up as a
+/// "breakpoint".
///
-/// Optionally, an "immediate" value (in the 0-255 range) can be passed to `bkpt!`. The debugger can
-/// then read this value using the Program Counter (PC).
+/// Optionally, an "immediate" value (in the 0-255 range) can be passed to
+/// `bkpt!`. The debugger can then read this value using the Program Counter
+/// (PC).
#[cfg(target_arch = "arm")]
#[macro_export]
macro_rules! bkpt {
() => {
- asm!("bkpt" :::: "volatile");
+ asm!("bkpt"
+ :
+ :
+ :
+ : "volatile");
};
($imm:expr) => {
- asm!(concat!("bkpt #", stringify!($imm)) :::: "volatile");
+ asm!(concat!("bkpt #", stringify!($imm))
+ :
+ :
+ :
+ : "volatile");
};
}
-/// Puts the processor in Debug state. Debuggers can pick this up as a "breakpoint".
+/// Puts the processor in Debug state. Debuggers can pick this up as a
+/// "breakpoint".
///
-/// Optionally, an "immediate" value (in the 0-255 range) can be passed to `bkpt!`. The debugger can
-/// then read this value using the Program Counter (PC).
+/// Optionally, an "immediate" value (in the 0-255 range) can be passed to
+/// `bkpt!`. The debugger can then read this value using the Program Counter
+/// (PC).
#[cfg(not(target_arch = "arm"))]
#[macro_export]
macro_rules! bkpt {
() => {
- asm!("nop" :::: "volatile");
+ asm!("");
};
($e:expr) => {
- asm!("nop" :::: "volatile");
+ asm!("");
};
}
-/// Wait for event
-pub unsafe fn wfe() {
+/// Wait For Event
+pub fn wfe() {
match () {
#[cfg(target_arch = "arm")]
- () => asm!("wfe" :::: "volatile"),
+ () => unsafe {
+ asm!("wfe"
+ :
+ :
+ :
+ : "volatile")
+ },
#[cfg(not(target_arch = "arm"))]
() => {}
}
}
-/// Wait for interupt
-pub unsafe fn wfi() {
+/// Wait For Interrupt
+pub fn wfi() {
match () {
#[cfg(target_arch = "arm")]
- () => asm!("wfi" :::: "volatile"),
+ () => unsafe{
+ asm!("wfi"
+ :
+ :
+ :
+ : "volatile")
+ },
#[cfg(not(target_arch = "arm"))]
() => {}
}
}
-/// A no-operation. Useful to stop delay loops being elided.
+/// A no-operation. Useful to prevent delay loops from being optimized away.
pub fn nop() {
unsafe {
- asm!("nop" :::: "volatile");
+ asm!("nop"
+ :
+ :
+ :
+ : "volatile");
}
}