aboutsummaryrefslogtreecommitdiff
path: root/rtic-monotonics/src/stm32.rs
diff options
context:
space:
mode:
authorFinomnis <Finomnis@users.noreply.github.com>2023-12-04 15:53:02 +0100
committerGitHub <noreply@github.com>2023-12-04 14:53:02 +0000
commitc227a71d243db6d539f3c64e3b4bb1b3ab282693 (patch)
tree6a1175f98d6c823b3e2beb1fbb9ed9e462f46811 /rtic-monotonics/src/stm32.rs
parent3de5f793f361d97e061999ce53130faae7bb0d2d (diff)
Refactor race condition free timer helper (#850)
* Implement half_period_counter in rtic-time * Rename compute_now to calculate_now, use it in stm32 and imxrt * Add more tests * Add some docs * Fix clippy warning, add imxrt timer to monotonics tests * Bump dependency version to make sure monotonics will build properly * Add changelog to rtic-monotonics * Add more docs * Add more docs * Finish documentation * Fix typos * Switch from atomic-polyfill to portable-atomic * Some more doc fixes * More doc fixes * Minor doc fix * Minor doc fix * Fix Atomics not existing * Fix example * Minor example improvement * Revert back to atomic-polyfill * Fix cargo.toml formatting * Remove atomic-polyfill * Attempt to fix unused macro warning * Remove atomics completely from half period counter * Minor doc fix * Doc fixes * Doc fixes * Remove obsolete comment * Fix ordering in monotonic initialization sequence
Diffstat (limited to 'rtic-monotonics/src/stm32.rs')
-rw-r--r--rtic-monotonics/src/stm32.rs24
1 files changed, 9 insertions, 15 deletions
diff --git a/rtic-monotonics/src/stm32.rs b/rtic-monotonics/src/stm32.rs
index 254f130..c86005e 100644
--- a/rtic-monotonics/src/stm32.rs
+++ b/rtic-monotonics/src/stm32.rs
@@ -35,8 +35,9 @@
//! ```
use crate::{Monotonic, TimeoutError, TimerQueue};
-use atomic_polyfill::{compiler_fence, AtomicU64, Ordering};
+use atomic_polyfill::{AtomicU64, Ordering};
pub use fugit::{self, ExtU64, ExtU64Ceil};
+use rtic_time::half_period_counter::calculate_now;
use stm32_metapac as pac;
mod _generated {
@@ -166,13 +167,14 @@ macro_rules! make_timer {
// Since this is not the case, it should be cleared.
$timer.sr().modify(|r| r.set_uif(false));
+ $tq.initialize(Self {});
+ $overflow.store(0, Ordering::SeqCst);
+
// Start the counter.
$timer.cr1().modify(|r| {
r.set_cen(true);
});
- $tq.initialize(Self {});
-
// SAFETY: We take full ownership of the peripheral and interrupt vector,
// plus we are not using any external shared resources so we won't impact
// basepri/source masking based critical sections.
@@ -231,18 +233,10 @@ macro_rules! make_timer {
const TICK_PERIOD: Self::Duration = Self::Duration::from_ticks(1);
fn now() -> Self::Instant {
- // Credits to the `time-driver` of `embassy-stm32`.
- // For more info, see the `imxrt` driver.
- fn calc_now(period: u64, counter: $bits) -> u64 {
- (period << ($bits::BITS - 1)) + u64::from(counter ^ (((period & 1) as $bits) << ($bits::BITS - 1)))
- }
-
- // Important: period **must** be read first.
- let period = $overflow.load(Ordering::Relaxed);
- compiler_fence(Ordering::Acquire);
- let counter = $timer.cnt().read().cnt();
-
- Self::Instant::from_ticks(calc_now(period, counter))
+ Self::Instant::from_ticks(calculate_now(
+ $overflow.load(Ordering::Relaxed),
+ || $timer.cnt().read().cnt()
+ ))
}
fn set_compare(instant: Self::Instant) {