Вступить в клуб →
средняявопросБиты, целые типы и арифметика на МК

На 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 теряет часть прерываний сравнения

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела