45 lines
1.1 KiB
Rust
45 lines
1.1 KiB
Rust
|
macro_rules! atomic_bits {
|
||
|
// the println macro cannot be rewritten because of the asm macro
|
||
|
($type:ty, $ldrex:expr, $strex:expr) => {
|
||
|
trait $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
|
||
|
}
|
||
|
}
|
||
|
}
|