Ну это да, такая ситуация возможна. Я повсеместно применяю
аппаратный таймер для меток времени, и он переполняется довольно
часто. Только прерывание не использую, гораздо проще делать так: uint64_t timer_long; // accumulated TIMER_REG with no overflows
void update_time(void)
{
static uint32_t before;
uint32_t now = TIMER_REG;
uint32_t diff = ((now << 8) - (before << 8)) >> 8;
before = now;
timer_long += diff;
}
Это для примера, сдвиги подобраны под ваши 24 разряда. Если вызывать функцию не реже, чем период переполнения таймера, то всё будет прекрасно.