aboutsummaryrefslogtreecommitdiff
path: root/src/asm.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/asm.rs')
-rw-r--r--src/asm.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/asm.rs b/src/asm.rs
new file mode 100644
index 0000000..3337626
--- /dev/null
+++ b/src/asm.rs
@@ -0,0 +1,35 @@
+//! Miscellaneous assembly instructions
+
+/// 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).
+#[macro_export]
+macro_rules! bkpt {
+ () => {
+ asm!("bkpt" :::: "volatile");
+ };
+ ($imm:expr) => {
+ asm!(concat!("bkpt #", stringify!($imm)) :::: "volatile");
+ };
+}
+
+/// Wait for event
+pub unsafe fn wfe() {
+ match () {
+ #[cfg(target_arch = "arm")]
+ () => asm!("wfe" :::: "volatile"),
+ #[cfg(not(target_arch = "arm"))]
+ () => {}
+ }
+}
+
+/// Wait for interupt
+pub unsafe fn wfi() {
+ match () {
+ #[cfg(target_arch = "arm")]
+ () => asm!("wfi" :::: "volatile"),
+ #[cfg(not(target_arch = "arm"))]
+ () => {}
+ }
+}