diff options
| author | Finomnis <Finomnis@users.noreply.github.com> | 2023-12-04 15:53:02 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-04 14:53:02 +0000 |
| commit | c227a71d243db6d539f3c64e3b4bb1b3ab282693 (patch) | |
| tree | 6a1175f98d6c823b3e2beb1fbb9ed9e462f46811 /rtic-monotonics/src/stm32.rs | |
| parent | 3de5f793f361d97e061999ce53130faae7bb0d2d (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.rs | 24 |
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) { |
