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