| macro_rules! atomic_bits { | |
| // the println macro cannot be rewritten because of the asm macro | |
| ($type:ty, $ldrex:expr, $strex:expr) => { | |
| impl AtomicBits for $type { | |
| unsafe fn load_excl(address: usize) -> Self { | |
| let raw: $type; | |
| asm!($ldrex | |
| : "=r"(raw) | |
| : "r"(address) | |
| : | |
| : "volatile"); | |
| raw | |
| } | |
| unsafe fn store_excl(self, address: usize) -> bool { | |
| let status: $type; | |
| println!("{}", | |
| status); | |
| status == 0 | |
| } | |
| } | |
| }; | |
| // the println macro should be rewritten here | |
| ($type:ty) => { | |
| fn some_func(self) { | |
| let status: $type; | |
| println!("{}", status); | |
| } | |
| }; | |
| // unrewritale macro in func | |
| ($type:ty, $ldrex:expr) => { | |
| unsafe fn load_excl(address: usize) -> Self { | |
| let raw: $type; | |
| asm!($ldrex | |
| : "=r"(raw) | |
| : "r"(address) | |
| : | |
| : "volatile"); | |
| raw | |
| } | |
| } | |
| } |