aboutsummaryrefslogtreecommitdiff
path: root/embassy-time/src/driver_std.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-time/src/driver_std.rs')
-rw-r--r--embassy-time/src/driver_std.rs20
1 files changed, 9 insertions, 11 deletions
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();