From 911fe8771e035f91bac170c37664ab64a29a6ee6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 17 Sep 2024 18:36:03 +0200 Subject: [PATCH] some more adaptions --- examples/embassy/src/lib.rs | 20 ++++++++------------ examples/embassy/src/main.rs | 2 +- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/examples/embassy/src/lib.rs b/examples/embassy/src/lib.rs index 2a0f6b3..a333821 100644 --- a/examples/embassy/src/lib.rs +++ b/examples/embassy/src/lib.rs @@ -150,7 +150,9 @@ impl TimerDriverEmbassy { let alarm = &self.alarms.borrow(cs)[i]; let at = alarm.timestamp.get(); let alarm_tim = alarm_tim(0); - if at < t + three_quarters_of_period(rst_val) { + if at < t { + self.trigger_alarm(i, cs); + } else if at - t <= u32::MAX as u64 { alarm_tim.enable().write(|w| unsafe { w.bits(0) }); alarm_tim .cnt_value() @@ -202,10 +204,9 @@ impl Driver for TimerDriverEmbassy { // Double read to protect against race conditions when the counter is overflowing. period2 = self.periods.load(Ordering::Relaxed); if period1 == period2 { - break; + return (period1 as u64 * rst_val as u64) + counter_val as u64; } } - (period1 as u64 * rst_val as u64) + counter_val as u64 } unsafe fn allocate_alarm(&self) -> Option { @@ -268,17 +269,12 @@ impl Driver for TimerDriverEmbassy { // by the Alarm trait contract. What's not allowed is triggering alarms *before* their scheduled time, // and we don't do that here. let safe_timestamp = timestamp.max(t + 3); - let rst_val = timekeeping_tim().rst_value().read().bits(); - let rst_val_alarm = (safe_timestamp % rst_val as u64) as u32; - alarm_tim - .rst_value() - .write(|w| unsafe { w.bits(rst_val_alarm) }); - - let diff = timestamp - t; - if diff < (three_quarters_of_period(rst_val as u64)) { + let diff = safe_timestamp - t; + alarm_tim.rst_value().write(|w| unsafe { w.bits(u32::MAX) }); + if diff <= u32::MAX as u64 { alarm_tim .cnt_value() - .write(|w| unsafe { w.bits(rst_val_alarm) }); + .write(|w| unsafe { w.bits(diff as u32) }); alarm_tim.ctrl().modify(|_, w| w.irq_enb().set_bit()); alarm_tim.enable().write(|w| unsafe { w.bits(1) }); } diff --git a/examples/embassy/src/main.rs b/examples/embassy/src/main.rs index 2680937..8bdffa6 100644 --- a/examples/embassy/src/main.rs +++ b/examples/embassy/src/main.rs @@ -38,7 +38,7 @@ async fn main(_spawner: Spawner) { let portg = PinsG::new(&mut dp.sysconfig, dp.portg); let mut led = portg.pg5.into_readable_push_pull_output(); loop { - Timer::after_secs(1).await; + Timer::after_millis(500).await; led.toggle().ok(); } }