Remove embassy-std crate.
All std features are in the core `embassy` crate.
This commit is contained in:
parent
d0c8749399
commit
ead6239435
@ -1,10 +0,0 @@
|
||||
[package]
|
||||
name = "embassy-std"
|
||||
version = "0.1.0"
|
||||
authors = ["Dario Nieuwenhuis <dirbaio@dirbaio.net>"]
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
embassy = { version = "0.1.0", path = "../embassy", features = ["std", "time-tick-32768hz"] }
|
||||
embassy-macros = { version = "0.1.0", path = "../embassy-macros", features = ["std"]}
|
||||
lazy_static = "1.4.0"
|
@ -1,121 +0,0 @@
|
||||
use embassy::executor::{raw, Spawner};
|
||||
use embassy::time::driver::{AlarmHandle, Driver};
|
||||
use embassy::time::TICKS_PER_SECOND;
|
||||
use std::marker::PhantomData;
|
||||
use std::mem::MaybeUninit;
|
||||
use std::ptr;
|
||||
use std::sync::{Condvar, Mutex};
|
||||
use std::time::{Duration as StdDuration, Instant as StdInstant};
|
||||
|
||||
static mut CLOCK_ZERO: MaybeUninit<StdInstant> = MaybeUninit::uninit();
|
||||
|
||||
static mut ALARM_AT: u64 = u64::MAX;
|
||||
static mut NEXT_ALARM_ID: u8 = 0;
|
||||
|
||||
struct TimeDriver;
|
||||
embassy::time_driver_impl!(TimeDriver);
|
||||
|
||||
impl Driver for TimeDriver {
|
||||
fn now() -> u64 {
|
||||
let zero = unsafe { CLOCK_ZERO.as_ptr().read() };
|
||||
let dur = StdInstant::now().duration_since(zero);
|
||||
dur.as_secs() * (TICKS_PER_SECOND as u64)
|
||||
+ (dur.subsec_nanos() as u64) * (TICKS_PER_SECOND as u64) / 1_000_000_000
|
||||
}
|
||||
|
||||
unsafe fn allocate_alarm() -> Option<AlarmHandle> {
|
||||
let r = NEXT_ALARM_ID;
|
||||
NEXT_ALARM_ID += 1;
|
||||
Some(AlarmHandle::new(r))
|
||||
}
|
||||
|
||||
fn set_alarm_callback(_alarm: AlarmHandle, _callback: fn(*mut ()), _ctx: *mut ()) {}
|
||||
|
||||
fn set_alarm(_alarm: AlarmHandle, timestamp: u64) {
|
||||
unsafe { ALARM_AT = ALARM_AT.min(timestamp) }
|
||||
}
|
||||
}
|
||||
|
||||
struct Signaler {
|
||||
mutex: Mutex<bool>,
|
||||
condvar: Condvar,
|
||||
}
|
||||
|
||||
impl Signaler {
|
||||
fn new() -> Self {
|
||||
Self {
|
||||
mutex: Mutex::new(false),
|
||||
condvar: Condvar::new(),
|
||||
}
|
||||
}
|
||||
|
||||
fn wait(&self) {
|
||||
let mut signaled = self.mutex.lock().unwrap();
|
||||
while !*signaled {
|
||||
let alarm_at = unsafe { ALARM_AT };
|
||||
if alarm_at == u64::MAX {
|
||||
signaled = self.condvar.wait(signaled).unwrap();
|
||||
} else {
|
||||
unsafe { ALARM_AT = u64::MAX };
|
||||
let now = TimeDriver::now();
|
||||
if now >= alarm_at {
|
||||
break;
|
||||
}
|
||||
|
||||
let left = alarm_at - now;
|
||||
let dur = StdDuration::new(
|
||||
left / (TICKS_PER_SECOND as u64),
|
||||
(left % (TICKS_PER_SECOND as u64) * 1_000_000_000 / (TICKS_PER_SECOND as u64))
|
||||
as u32,
|
||||
);
|
||||
let (signaled2, timeout) = self.condvar.wait_timeout(signaled, dur).unwrap();
|
||||
signaled = signaled2;
|
||||
if timeout.timed_out() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
*signaled = false;
|
||||
}
|
||||
|
||||
fn signal(ctx: *mut ()) {
|
||||
let this = unsafe { &*(ctx as *mut Self) };
|
||||
let mut signaled = this.mutex.lock().unwrap();
|
||||
*signaled = true;
|
||||
this.condvar.notify_one();
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Executor {
|
||||
inner: raw::Executor,
|
||||
not_send: PhantomData<*mut ()>,
|
||||
signaler: Signaler,
|
||||
}
|
||||
|
||||
impl Executor {
|
||||
pub fn new() -> Self {
|
||||
unsafe {
|
||||
CLOCK_ZERO.as_mut_ptr().write(StdInstant::now());
|
||||
}
|
||||
|
||||
Self {
|
||||
inner: raw::Executor::new(Signaler::signal, ptr::null_mut()),
|
||||
not_send: PhantomData,
|
||||
signaler: Signaler::new(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Runs the executor.
|
||||
///
|
||||
/// This function never returns.
|
||||
pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! {
|
||||
self.inner.set_signal_ctx(&self.signaler as *const _ as _);
|
||||
|
||||
init(unsafe { self.inner.spawner() });
|
||||
|
||||
loop {
|
||||
unsafe { self.inner.run_queued() };
|
||||
self.signaler.wait();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user