aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-04-13 23:50:41 +0200
committerDario Nieuwenhuis <[email protected]>2023-04-13 23:57:20 +0200
commite7ff759f1ca78a5b53c1ea95c24a6317227dc8b0 (patch)
tree0e0cca2dcbe49545b0b7edd2125b62e7955db471
parent62ecd973504644fa5e9f6d69d772c2f3b8903f50 (diff)
time: remove dependency on embassy-sync.
-rw-r--r--embassy-time/Cargo.toml1
-rw-r--r--embassy-time/src/driver_std.rs20
-rw-r--r--embassy-time/src/queue_generic.rs12
3 files changed, 14 insertions, 19 deletions
diff --git a/embassy-time/Cargo.toml b/embassy-time/Cargo.toml
index 3a36dfde0..a8a7e9337 100644
--- a/embassy-time/Cargo.toml
+++ b/embassy-time/Cargo.toml
@@ -156,7 +156,6 @@ embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10", option
156embedded-hal-async = { version = "=0.2.0-alpha.1", optional = true} 156embedded-hal-async = { version = "=0.2.0-alpha.1", optional = true}
157 157
158futures-util = { version = "0.3.17", default-features = false } 158futures-util = { version = "0.3.17", default-features = false }
159embassy-sync = { version = "0.2.0", path = "../embassy-sync" }
160atomic-polyfill = "1.0.1" 159atomic-polyfill = "1.0.1"
161critical-section = "1.1" 160critical-section = "1.1"
162cfg-if = "1.0.0" 161cfg-if = "1.0.0"
diff --git a/embassy-time/src/driver_std.rs b/embassy-time/src/driver_std.rs
index da46a599d..9f8c57b5c 100644
--- a/embassy-time/src/driver_std.rs
+++ b/embassy-time/src/driver_std.rs
@@ -5,8 +5,7 @@ use std::time::{Duration as StdDuration, Instant as StdInstant};
5use std::{mem, ptr, thread}; 5use std::{mem, ptr, thread};
6 6
7use atomic_polyfill::{AtomicU8, Ordering}; 7use atomic_polyfill::{AtomicU8, Ordering};
8use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; 8use critical_section::Mutex as CsMutex;
9use embassy_sync::blocking_mutex::Mutex as EmbassyMutex;
10 9
11use crate::driver::{AlarmHandle, Driver}; 10use crate::driver::{AlarmHandle, Driver};
12 11
@@ -40,7 +39,7 @@ struct TimeDriver {
40 // The STD Driver implementation requires the alarms' mutex to be reentrant, which the STD Mutex isn't 39 // The STD Driver implementation requires the alarms' mutex to be reentrant, which the STD Mutex isn't
41 // Fortunately, mutexes based on the `critical-section` crate are reentrant, because the critical sections 40 // Fortunately, mutexes based on the `critical-section` crate are reentrant, because the critical sections
42 // themselves are reentrant 41 // themselves are reentrant
43 alarms: UninitCell<EmbassyMutex<CriticalSectionRawMutex, RefCell<[AlarmState; ALARM_COUNT]>>>, 42 alarms: UninitCell<CsMutex<RefCell<[AlarmState; ALARM_COUNT]>>>,
44 zero_instant: UninitCell<StdInstant>, 43 zero_instant: UninitCell<StdInstant>,
45 signaler: UninitCell<Signaler>, 44 signaler: UninitCell<Signaler>,
46} 45}
@@ -58,8 +57,7 @@ crate::time_driver_impl!(static DRIVER: TimeDriver = TimeDriver {
58impl TimeDriver { 57impl TimeDriver {
59 fn init(&self) { 58 fn init(&self) {
60 self.once.call_once(|| unsafe { 59 self.once.call_once(|| unsafe {
61 self.alarms 60 self.alarms.write(CsMutex::new(RefCell::new([ALARM_NEW; ALARM_COUNT])));
62 .write(EmbassyMutex::new(RefCell::new([ALARM_NEW; ALARM_COUNT])));
63 self.zero_instant.write(StdInstant::now()); 61 self.zero_instant.write(StdInstant::now());
64 self.signaler.write(Signaler::new()); 62 self.signaler.write(Signaler::new());
65 63
@@ -72,7 +70,8 @@ impl TimeDriver {
72 loop { 70 loop {
73 let now = DRIVER.now(); 71 let now = DRIVER.now();
74 72
75 let next_alarm = unsafe { DRIVER.alarms.as_ref() }.lock(|alarms| { 73 let next_alarm = critical_section::with(|cs| {
74 let alarms = unsafe { DRIVER.alarms.as_ref() }.borrow(cs);
76 loop { 75 loop {
77 let pending = alarms 76 let pending = alarms
78 .borrow_mut() 77 .borrow_mut()
@@ -139,8 +138,8 @@ impl Driver for TimeDriver {
139 138
140 fn set_alarm_callback(&self, alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) { 139 fn set_alarm_callback(&self, alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) {
141 self.init(); 140 self.init();
142 unsafe { self.alarms.as_ref() }.lock(|alarms| { 141 critical_section::with(|cs| {
143 let mut alarms = alarms.borrow_mut(); 142 let mut alarms = unsafe { self.alarms.as_ref() }.borrow_ref_mut(cs);
144 let alarm = &mut alarms[alarm.id() as usize]; 143 let alarm = &mut alarms[alarm.id() as usize];
145 alarm.callback = callback as *const (); 144 alarm.callback = callback as *const ();
146 alarm.ctx = ctx; 145 alarm.ctx = ctx;
@@ -149,9 +148,8 @@ impl Driver for TimeDriver {
149 148
150 fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool { 149 fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool {
151 self.init(); 150 self.init();
152 unsafe { self.alarms.as_ref() }.lock(|alarms| { 151 critical_section::with(|cs| {
153 let mut alarms = alarms.borrow_mut(); 152 let mut alarms = unsafe { self.alarms.as_ref() }.borrow_ref_mut(cs);
154
155 let alarm = &mut alarms[alarm.id() as usize]; 153 let alarm = &mut alarms[alarm.id() as usize];
156 alarm.timestamp = timestamp; 154 alarm.timestamp = timestamp;
157 unsafe { self.signaler.as_ref() }.signal(); 155 unsafe { self.signaler.as_ref() }.signal();
diff --git a/embassy-time/src/queue_generic.rs b/embassy-time/src/queue_generic.rs
index 20ae7e6cc..0f67d9dbb 100644
--- a/embassy-time/src/queue_generic.rs
+++ b/embassy-time/src/queue_generic.rs
@@ -2,8 +2,7 @@ use core::cell::RefCell;
2use core::cmp::{min, Ordering}; 2use core::cmp::{min, Ordering};
3use core::task::Waker; 3use core::task::Waker;
4 4
5use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; 5use critical_section::Mutex;
6use embassy_sync::blocking_mutex::Mutex;
7use heapless::Vec; 6use heapless::Vec;
8 7
9use crate::driver::{allocate_alarm, set_alarm, set_alarm_callback, AlarmHandle}; 8use crate::driver::{allocate_alarm, set_alarm, set_alarm_callback, AlarmHandle};
@@ -129,7 +128,7 @@ impl InnerQueue {
129} 128}
130 129
131struct Queue { 130struct Queue {
132 inner: Mutex<CriticalSectionRawMutex, RefCell<Option<InnerQueue>>>, 131 inner: Mutex<RefCell<Option<InnerQueue>>>,
133} 132}
134 133
135impl Queue { 134impl Queue {
@@ -140,8 +139,8 @@ impl Queue {
140 } 139 }
141 140
142 fn schedule_wake(&'static self, at: Instant, waker: &Waker) { 141 fn schedule_wake(&'static self, at: Instant, waker: &Waker) {
143 self.inner.lock(|inner| { 142 critical_section::with(|cs| {
144 let mut inner = inner.borrow_mut(); 143 let mut inner = self.inner.borrow_ref_mut(cs);
145 144
146 if inner.is_none() {} 145 if inner.is_none() {}
147 146
@@ -159,8 +158,7 @@ impl Queue {
159 } 158 }
160 159
161 fn handle_alarm(&self) { 160 fn handle_alarm(&self) {
162 self.inner 161 critical_section::with(|cs| self.inner.borrow_ref_mut(cs).as_mut().unwrap().handle_alarm())
163 .lock(|inner| inner.borrow_mut().as_mut().unwrap().handle_alarm());
164 } 162 }
165 163
166 fn handle_alarm_callback(ctx: *mut ()) { 164 fn handle_alarm_callback(ctx: *mut ()) {