На ATmega счётчик времени изредка прыгает назад на минуту
volatile uint32_t ms = 0;
ISR(TIMER0_COMPA_vect) { ms++; }
uint32_t now(void) { return ms; }
Раз в несколько часов now() возвращает значение на ~65,5 секунды меньше предыдущего, и логика таймаутов сходит с ума. volatile стоит. В чём причина?
- Копирование 4 байт прерывается посреди чтения
- volatile запрещает чтение переменной из main
- Счётчик переполняется каждые 65,5 секунды
- Таймер 0 теряет часть прерываний сравнения
