diff options
Diffstat (limited to 'src/asm.rs')
-rw-r--r-- | src/asm.rs | 80 |
1 files changed, 41 insertions, 39 deletions
@@ -1,58 +1,60 @@ //! 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). -#[cfg(target_arch = "arm")] -#[macro_export] -macro_rules! bkpt { - () => { - asm!("bkpt" :::: "volatile"); - }; - ($imm:expr) => { - asm!(concat!("bkpt #", stringify!($imm)) :::: "volatile"); - }; +/// NOTE calling `bkpt` when the processor is not connected to a debugger will +/// cause an exception +#[inline(always)] +pub fn bkpt() { + #[cfg(target_arch = "arm")] + unsafe { + asm!("bkpt" + : + : + : + : "volatile"); + } } -/// 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). -#[cfg(not(target_arch = "arm"))] -#[macro_export] -macro_rules! bkpt { - () => { - asm!("nop" :::: "volatile"); - }; - ($e:expr) => { - asm!("nop" :::: "volatile"); - }; +/// A no-operation. Useful to prevent delay loops from being optimized away. +pub fn nop() { + unsafe { + asm!("nop" + : + : + : + : "volatile"); + } } - -/// 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. -pub fn nop() { - unsafe { - asm!("nop" :::: "volatile"); - } -} |