| 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 |
| } |
| } |
| } |