fetch RTC count more atomically
This commit is contained in:
parent
da035fe958
commit
b18b0fd5b9
@ -498,21 +498,31 @@ uint32_t port_get_saved_word(void) {
|
||||
static volatile uint64_t overflowed_ticks = 0;
|
||||
|
||||
static uint32_t _get_count(uint64_t *overflow_count) {
|
||||
#ifdef SAM_D5X_E5X
|
||||
while ((RTC->MODE0.SYNCBUSY.reg & (RTC_MODE0_SYNCBUSY_COUNTSYNC | RTC_MODE0_SYNCBUSY_COUNT)) != 0) {
|
||||
}
|
||||
#endif
|
||||
// SAMD21 does continuous sync so we don't need to wait here.
|
||||
while(1) {
|
||||
// Disable interrupts so we can grab the count and the overflow atomically.
|
||||
common_hal_mcu_disable_interrupts();
|
||||
|
||||
// Disable interrupts so we can grab the count and the overflow.
|
||||
common_hal_mcu_disable_interrupts();
|
||||
uint32_t count = RTC->MODE0.COUNT.reg;
|
||||
if (overflow_count != NULL) {
|
||||
*overflow_count = overflowed_ticks;
|
||||
}
|
||||
common_hal_mcu_enable_interrupts();
|
||||
#ifdef SAM_D5X_E5X
|
||||
while ((RTC->MODE0.SYNCBUSY.reg & (RTC_MODE0_SYNCBUSY_COUNTSYNC | RTC_MODE0_SYNCBUSY_COUNT)) != 0) {
|
||||
}
|
||||
#endif
|
||||
// SAMD21 does continuous sync so we don't need to wait here.
|
||||
|
||||
return count;
|
||||
uint32_t count = RTC->MODE0.COUNT.reg;
|
||||
if (overflow_count != NULL) {
|
||||
*overflow_count = overflowed_ticks;
|
||||
}
|
||||
|
||||
bool overflow_pending = RTC->MODE0.INTFLAG.bit.OVF;
|
||||
|
||||
common_hal_mcu_enable_interrupts();
|
||||
|
||||
if (!overflow_pending) {
|
||||
return count;
|
||||
}
|
||||
|
||||
// Try again if overflow hasn't been processed yet.
|
||||
}
|
||||
}
|
||||
|
||||
volatile bool _woken_up;
|
||||
|
Loading…
Reference in New Issue
Block a user