Merge pull request #6004 from dhalbert/samd-rtc-count-overflow

fetch RTC count more atomically
This commit is contained in:
Scott Shawcroft 2022-02-10 10:16:57 -08:00 committed by GitHub
commit 54589de15b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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;