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,23 +498,33 @@ uint32_t port_get_saved_word(void) {
static volatile uint64_t overflowed_ticks = 0; static volatile uint64_t overflowed_ticks = 0;
static uint32_t _get_count(uint64_t *overflow_count) { static uint32_t _get_count(uint64_t *overflow_count) {
while(1) {
// Disable interrupts so we can grab the count and the overflow atomically.
common_hal_mcu_disable_interrupts();
#ifdef SAM_D5X_E5X #ifdef SAM_D5X_E5X
while ((RTC->MODE0.SYNCBUSY.reg & (RTC_MODE0_SYNCBUSY_COUNTSYNC | RTC_MODE0_SYNCBUSY_COUNT)) != 0) { while ((RTC->MODE0.SYNCBUSY.reg & (RTC_MODE0_SYNCBUSY_COUNTSYNC | RTC_MODE0_SYNCBUSY_COUNT)) != 0) {
} }
#endif #endif
// SAMD21 does continuous sync so we don't need to wait here. // SAMD21 does continuous sync so we don't need to wait here.
// Disable interrupts so we can grab the count and the overflow.
common_hal_mcu_disable_interrupts();
uint32_t count = RTC->MODE0.COUNT.reg; uint32_t count = RTC->MODE0.COUNT.reg;
if (overflow_count != NULL) { if (overflow_count != NULL) {
*overflow_count = overflowed_ticks; *overflow_count = overflowed_ticks;
} }
bool overflow_pending = RTC->MODE0.INTFLAG.bit.OVF;
common_hal_mcu_enable_interrupts(); common_hal_mcu_enable_interrupts();
if (!overflow_pending) {
return count; return count;
} }
// Try again if overflow hasn't been processed yet.
}
}
volatile bool _woken_up; volatile bool _woken_up;
void RTC_Handler(void) { void RTC_Handler(void) {