为在裸机环境下使用自旋锁,需按以下步骤操作:
[features]
default = []
unstable = []
#![no_std]
use core::{sync::atomic::{AtomicBool, Ordering}, marker::PhantomData};
use volatile::Volatile;
pub struct Spinlock {
lock: Volatile,
data: Volatile,
phantom: PhantomData<*mut T>,
}
impl Spinlock {
pub const fn new(data: T) -> Self {
Self {
lock: Volatile::new(false),
data: Volatile::new(data),
phantom: PhantomData,
}
}
pub fn lock(&self) {
while self.lock.swap(true, Ordering::Acquire) {}
}
pub fn unlock(&self) {
self.lock.store(false, Ordering::Release);
}
pub fn get_mut(&mut self) -> &mut T {
&mut self.data
}
pub fn get_immut(&self) -> &T {
&self.data
}
}
static SPINLOCK: Spinlock = Spinlock::new(0);
fn spinlock_test() {
SPINLOCK.lock();
*SPINLOCK.get_mut() += 1;
SPINLOCK.unlock();
}