mirror of
https://github.com/rtic-rs/rtic.git
synced 2025-12-18 05:45:19 +01:00
Fix nrf::rtc errata workaround (#858)
* Deprecate `should_dequeue_check` * Fix errata by delaying the wakeup point * Add changelog * Fix changelog typos
This commit is contained in:
parent
89160b7cb9
commit
f377471e44
6 changed files with 34 additions and 18 deletions
|
|
@ -9,8 +9,9 @@ For each category, *Added*, *Changed*, *Fixed* add new entries at the top!
|
|||
|
||||
### Fixed
|
||||
|
||||
- Race condition in `nrf::timer`.
|
||||
- Race condition in `nrf::rtc`.
|
||||
- Fix race condition in `nrf::timer`.
|
||||
- Fix race condition in `nrf::rtc`.
|
||||
- Fix errata in `nrf::rtc`.
|
||||
- Add internal counter integrity check to all half-period based monotonics.
|
||||
|
||||
## v1.4.0 - 2023-12-04
|
||||
|
|
|
|||
|
|
@ -243,19 +243,29 @@ macro_rules! make_rtc {
|
|||
}
|
||||
}
|
||||
|
||||
// NOTE: To fix errata for RTC, if the release time is within 4 ticks
|
||||
// we release as the RTC will not generate a compare interrupt...
|
||||
fn should_dequeue_check(release_at: Self::Instant) -> bool {
|
||||
Self::now() + <Self as Monotonic>::Duration::from_ticks(4) >= release_at
|
||||
}
|
||||
|
||||
fn enable_timer() {}
|
||||
|
||||
fn disable_timer() {}
|
||||
|
||||
fn set_compare(instant: Self::Instant) {
|
||||
fn set_compare(mut instant: Self::Instant) {
|
||||
let rtc = unsafe { &*$rtc::PTR };
|
||||
unsafe { rtc.cc[0].write(|w| w.bits(instant.ticks() as u32 & 0xff_ffff)) };
|
||||
|
||||
// Disable interrupts because this section is timing critical.
|
||||
// We rely on the fact that this entire section runs within one
|
||||
// RTC clock tick. (which it will do easily if it doesn't get
|
||||
// interrupted)
|
||||
critical_section::with(|_|{
|
||||
let now = Self::now();
|
||||
if let Some(diff) = instant.checked_duration_since(now) {
|
||||
// Errata: Timer interrupts don't fire if they are scheduled less than
|
||||
// two ticks in the future. Make it three, because the timer could
|
||||
// tick right now.
|
||||
if diff.ticks() < 3 {
|
||||
instant = Self::Instant::from_ticks(now.ticks().wrapping_add(3));
|
||||
}
|
||||
unsafe { rtc.cc[0].write(|w| w.bits(instant.ticks() as u32 & 0xff_ffff)) };
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fn clear_compare_flag() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue