use crate::{sync::Value, task::WakerSet};
use core::{
future::{poll_fn, Future},
sync::atomic::Ordering,
task::Poll,
};
pub fn millis() -> usize {
MILLIS.load(Ordering::Relaxed)
}
pub fn sleep_millis(mut duration: usize) -> impl Future<Output = ()> {
let mut start = millis();
poll_fn(move |ctx| {
let current = millis();
let elapsed = current.wrapping_sub(start);
if elapsed >= duration {
Poll::Ready(())
} else {
duration -= elapsed;
start = current;
SYSTICK_WAKERS.add(ctx.waker().clone());
Poll::Pending
}
})
}
static MILLIS: Value = Value::new(0);
static SYSTICK_WAKERS: WakerSet = WakerSet::new();
pub extern "C" fn systick_intr() {
let millis = MILLIS.load(Ordering::Relaxed);
let millis = millis.wrapping_add(1);
MILLIS.store(millis, Ordering::Relaxed);
SYSTICK_WAKERS.wake();
}