aboutsummaryrefslogtreecommitdiff
path: root/rtic-monotonics/src
diff options
context:
space:
mode:
authorGravatar Finomnis <Finomnis@users.noreply.github.com> 2023-12-01 08:59:22 +0100
committerGravatar GitHub <noreply@github.com> 2023-12-01 07:59:22 +0000
commit612a47ef4d09da3553145d77bf1750314bbb7b16 (patch)
tree7f6f6beca7e0c81397994b4f835c6a7f0bbee331 /rtic-monotonics/src
parent9f5820da1d36a8c84455b1bc0458d34eb7dd9a70 (diff)
downloadrtic-612a47ef4d09da3553145d77bf1750314bbb7b16.tar.gz
rtic-612a47ef4d09da3553145d77bf1750314bbb7b16.tar.zst
rtic-612a47ef4d09da3553145d77bf1750314bbb7b16.zip
Fix mono delay (#843)
* rtic-time: Compenstate for timer uncertainty * Update changelog and incorrect cargo.lock in an example * Fix Monotonic impls * Fix tests * Fix other monotonics, again * Update changelog * Fix example * Fix DelayUs and DelayMs impls * Minor coding style fix in u64 conversions * Fix all changelogs * Fix changelog * Fix blocking DelayUs * Minor monotonic rework * Add delay precision test * Add more tests * Add rust-version tags to Cargo.toml * Fix imxrt, rp2040 and systick timer * Fix more monotonics * Fix systick monotonic * Some reverts * Fix imxrt * Fix nrf * Fix rp2040 * Fix stm32 * Fix systick * Fix rtic-time tests * Bump to e-h.rc2 * Apply e-h.rc2 fixes to rtic-time * Apply fixes from arbiter * Fix clippy warning * Minor beautification * Revert previous changes * Fix variable name * Add blocking tests, but disable them by default
Diffstat (limited to 'rtic-monotonics/src')
-rw-r--r--rtic-monotonics/src/imxrt.rs24
-rw-r--r--rtic-monotonics/src/nrf/rtc.rs23
-rw-r--r--rtic-monotonics/src/nrf/timer.rs24
-rw-r--r--rtic-monotonics/src/rp2040.rs22
-rw-r--r--rtic-monotonics/src/stm32.rs24
-rw-r--r--rtic-monotonics/src/systick.rs33
6 files changed, 37 insertions, 113 deletions
diff --git a/rtic-monotonics/src/imxrt.rs b/rtic-monotonics/src/imxrt.rs
index 39448291..97ba73f8 100644
--- a/rtic-monotonics/src/imxrt.rs
+++ b/rtic-monotonics/src/imxrt.rs
@@ -31,7 +31,7 @@
use crate::{Monotonic, TimeoutError, TimerQueue};
use atomic_polyfill::{compiler_fence, AtomicU32, Ordering};
-pub use fugit::{self, ExtU64};
+pub use fugit::{self, ExtU64, ExtU64Ceil};
use imxrt_ral as ral;
@@ -216,31 +216,17 @@ macro_rules! make_timer {
}
}
- #[cfg(feature = "embedded-hal-async")]
- impl embedded_hal_async::delay::DelayUs for $mono_name {
- #[inline]
- async fn delay_us(&mut self, us: u32) {
- Self::delay((us as u64).micros()).await;
- }
-
- #[inline]
- async fn delay_ms(&mut self, ms: u32) {
- Self::delay((ms as u64).millis()).await;
- }
- }
+ rtic_time::embedded_hal_delay_impl_fugit64!($mono_name);
- impl embedded_hal::delay::DelayUs for $mono_name {
- fn delay_us(&mut self, us: u32) {
- let done = Self::now() + (us as u64).micros();
- while Self::now() < done {}
- }
- }
+ #[cfg(feature = "embedded-hal-async")]
+ rtic_time::embedded_hal_async_delay_impl_fugit64!($mono_name);
impl Monotonic for $mono_name {
type Instant = fugit::TimerInstantU64<TIMER_HZ>;
type Duration = fugit::TimerDurationU64<TIMER_HZ>;
const ZERO: Self::Instant = Self::Instant::from_ticks(0);
+ const TICK_PERIOD: Self::Duration = Self::Duration::from_ticks(1);
fn now() -> Self::Instant {
let gpt = unsafe{ $timer::instance() };
diff --git a/rtic-monotonics/src/nrf/rtc.rs b/rtic-monotonics/src/nrf/rtc.rs
index 94913071..1f4e34f5 100644
--- a/rtic-monotonics/src/nrf/rtc.rs
+++ b/rtic-monotonics/src/nrf/rtc.rs
@@ -43,7 +43,7 @@ use nrf9160_pac::{self as pac, Interrupt, RTC0_NS as RTC0, RTC1_NS as RTC1};
use crate::{Monotonic, TimeoutError, TimerQueue};
use atomic_polyfill::{AtomicU32, Ordering};
use core::future::Future;
-pub use fugit::{self, ExtU64};
+pub use fugit::{self, ExtU64, ExtU64Ceil};
#[doc(hidden)]
#[macro_export]
@@ -167,28 +167,15 @@ macro_rules! make_rtc {
}
}
- #[cfg(feature = "embedded-hal-async")]
- impl embedded_hal_async::delay::DelayUs for $mono_name {
- #[inline]
- async fn delay_us(&mut self, us: u32) {
- Self::delay((us as u64).micros()).await;
- }
- #[inline]
- async fn delay_ms(&mut self, ms: u32) {
- Self::delay((ms as u64).millis()).await;
- }
- }
+ rtic_time::embedded_hal_delay_impl_fugit64!($mono_name);
- impl embedded_hal::delay::DelayUs for $mono_name {
- fn delay_us(&mut self, us: u32) {
- let done = Self::now() + u64::from(us).micros();
- while Self::now() < done {}
- }
- }
+ #[cfg(feature = "embedded-hal-async")]
+ rtic_time::embedded_hal_async_delay_impl_fugit64!($mono_name);
impl Monotonic for $mono_name {
const ZERO: Self::Instant = Self::Instant::from_ticks(0);
+ const TICK_PERIOD: Self::Duration = Self::Duration::from_ticks(1);
type Instant = fugit::TimerInstantU64<32_768>;
type Duration = fugit::TimerDurationU64<32_768>;
diff --git a/rtic-monotonics/src/nrf/timer.rs b/rtic-monotonics/src/nrf/timer.rs
index 589cc6fd..0488ca9b 100644
--- a/rtic-monotonics/src/nrf/timer.rs
+++ b/rtic-monotonics/src/nrf/timer.rs
@@ -29,7 +29,7 @@
use crate::{Monotonic, TimeoutError, TimerQueue};
use atomic_polyfill::{AtomicU32, Ordering};
use core::future::Future;
-pub use fugit::{self, ExtU64};
+pub use fugit::{self, ExtU64, ExtU64Ceil};
#[cfg(feature = "nrf52810")]
use nrf52810_pac::{self as pac, Interrupt, TIMER0, TIMER1, TIMER2};
@@ -203,28 +203,14 @@ macro_rules! make_timer {
}
}
- #[cfg(feature = "embedded-hal-async")]
- impl embedded_hal_async::delay::DelayUs for $mono_name {
- #[inline]
- async fn delay_us(&mut self, us: u32) {
- Self::delay((us as u64).micros()).await;
- }
-
- #[inline]
- async fn delay_ms(&mut self, ms: u32) {
- Self::delay((ms as u64).millis()).await;
- }
- }
+ rtic_time::embedded_hal_delay_impl_fugit64!($mono_name);
- impl embedded_hal::delay::DelayUs for $mono_name {
- fn delay_us(&mut self, us: u32) {
- let done = Self::now() + (us as u64).micros();
- while Self::now() < done {}
- }
- }
+ #[cfg(feature = "embedded-hal-async")]
+ rtic_time::embedded_hal_async_delay_impl_fugit64!($mono_name);
impl Monotonic for $mono_name {
const ZERO: Self::Instant = Self::Instant::from_ticks(0);
+ const TICK_PERIOD: Self::Duration = Self::Duration::from_ticks(1);
type Instant = fugit::TimerInstantU64<1_000_000>;
type Duration = fugit::TimerDurationU64<1_000_000>;
diff --git a/rtic-monotonics/src/rp2040.rs b/rtic-monotonics/src/rp2040.rs
index 130c7d3e..998b5325 100644
--- a/rtic-monotonics/src/rp2040.rs
+++ b/rtic-monotonics/src/rp2040.rs
@@ -28,7 +28,7 @@ use super::Monotonic;
pub use super::{TimeoutError, TimerQueue};
use core::future::Future;
-pub use fugit::{self, ExtU64};
+pub use fugit::{self, ExtU64, ExtU64Ceil};
use rp2040_pac::{timer, Interrupt, NVIC, RESETS, TIMER};
/// Timer implementing [`Monotonic`] which runs at 1 MHz.
@@ -104,6 +104,7 @@ impl Monotonic for Timer {
type Duration = fugit::TimerDurationU64<1_000_000>;
const ZERO: Self::Instant = Self::Instant::from_ticks(0);
+ const TICK_PERIOD: Self::Duration = Self::Duration::from_ticks(1);
fn now() -> Self::Instant {
let timer = Self::timer();
@@ -151,23 +152,10 @@ impl Monotonic for Timer {
fn disable_timer() {}
}
-#[cfg(feature = "embedded-hal-async")]
-impl embedded_hal_async::delay::DelayUs for Timer {
- async fn delay_us(&mut self, us: u32) {
- Self::delay((us as u64).micros()).await;
- }
-
- async fn delay_ms(&mut self, ms: u32) {
- Self::delay((ms as u64).millis()).await;
- }
-}
+rtic_time::embedded_hal_delay_impl_fugit64!(Timer);
-impl embedded_hal::delay::DelayUs for Timer {
- fn delay_us(&mut self, us: u32) {
- let done = Self::now() + u64::from(us).micros();
- while Self::now() < done {}
- }
-}
+#[cfg(feature = "embedded-hal-async")]
+rtic_time::embedded_hal_async_delay_impl_fugit64!(Timer);
/// Register the Timer interrupt for the monotonic.
#[macro_export]
diff --git a/rtic-monotonics/src/stm32.rs b/rtic-monotonics/src/stm32.rs
index 2676a346..254f1302 100644
--- a/rtic-monotonics/src/stm32.rs
+++ b/rtic-monotonics/src/stm32.rs
@@ -36,7 +36,7 @@
use crate::{Monotonic, TimeoutError, TimerQueue};
use atomic_polyfill::{compiler_fence, AtomicU64, Ordering};
-pub use fugit::{self, ExtU64};
+pub use fugit::{self, ExtU64, ExtU64Ceil};
use stm32_metapac as pac;
mod _generated {
@@ -218,31 +218,17 @@ macro_rules! make_timer {
}
}
- #[cfg(feature = "embedded-hal-async")]
- impl embedded_hal_async::delay::DelayUs for $mono_name {
- #[inline]
- async fn delay_us(&mut self, us: u32) {
- Self::delay((us as u64).micros()).await;
- }
-
- #[inline]
- async fn delay_ms(&mut self, ms: u32) {
- Self::delay((ms as u64).millis()).await;
- }
- }
+ rtic_time::embedded_hal_delay_impl_fugit64!($mono_name);
- impl embedded_hal::delay::DelayUs for $mono_name {
- fn delay_us(&mut self, us: u32) {
- let done = Self::now() + (us as u64).micros();
- while Self::now() < done {}
- }
- }
+ #[cfg(feature = "embedded-hal-async")]
+ rtic_time::embedded_hal_async_delay_impl_fugit64!($mono_name);
impl Monotonic for $mono_name {
type Instant = fugit::TimerInstantU64<TIMER_HZ>;
type Duration = fugit::TimerDurationU64<TIMER_HZ>;
const ZERO: Self::Instant = Self::Instant::from_ticks(0);
+ const TICK_PERIOD: Self::Duration = Self::Duration::from_ticks(1);
fn now() -> Self::Instant {
// Credits to the `time-driver` of `embassy-stm32`.
diff --git a/rtic-monotonics/src/systick.rs b/rtic-monotonics/src/systick.rs
index 265ca9a0..9bd056ce 100644
--- a/rtic-monotonics/src/systick.rs
+++ b/rtic-monotonics/src/systick.rs
@@ -40,11 +40,11 @@ use cortex_m::peripheral::SYST;
pub use fugit;
cfg_if::cfg_if! {
if #[cfg(feature = "systick-64bit")] {
- pub use fugit::ExtU64;
+ pub use fugit::{ExtU64, ExtU64Ceil};
use atomic_polyfill::AtomicU64;
static SYSTICK_CNT: AtomicU64 = AtomicU64::new(0);
} else {
- pub use fugit::ExtU32;
+ pub use fugit::{ExtU32, ExtU32Ceil};
use atomic_polyfill::AtomicU32;
static SYSTICK_CNT: AtomicU32 = AtomicU32::new(0);
}
@@ -156,6 +156,7 @@ impl Monotonic for Systick {
}
const ZERO: Self::Instant = Self::Instant::from_ticks(0);
+ const TICK_PERIOD: Self::Duration = Self::Duration::from_ticks(1);
fn now() -> Self::Instant {
if Self::systick().has_wrapped() {
@@ -188,27 +189,17 @@ impl Monotonic for Systick {
fn disable_timer() {}
}
-#[cfg(feature = "embedded-hal-async")]
-impl embedded_hal_async::delay::DelayUs for Systick {
- async fn delay_us(&mut self, us: u32) {
- #[cfg(feature = "systick-64bit")]
- let us = u64::from(us);
- Self::delay(us.micros()).await;
- }
+cfg_if::cfg_if! {
+ if #[cfg(feature = "systick-64bit")] {
+ rtic_time::embedded_hal_delay_impl_fugit64!(Systick);
- async fn delay_ms(&mut self, ms: u32) {
- #[cfg(feature = "systick-64bit")]
- let ms = u64::from(ms);
- Self::delay(ms.millis()).await;
- }
-}
+ #[cfg(feature = "embedded-hal-async")]
+ rtic_time::embedded_hal_async_delay_impl_fugit64!(Systick);
+ } else {
+ rtic_time::embedded_hal_delay_impl_fugit32!(Systick);
-impl embedded_hal::delay::DelayUs for Systick {
- fn delay_us(&mut self, us: u32) {
- #[cfg(feature = "systick-64bit")]
- let us = u64::from(us);
- let done = Self::now() + us.micros();
- while Self::now() < done {}
+ #[cfg(feature = "embedded-hal-async")]
+ rtic_time::embedded_hal_async_delay_impl_fugit32!(Systick);
}
}