>> Tecnologia Eletrônica >  >> Áudio Pessoal >> Rádios-relógio

Overflow de Timer: Mecanismo, Consequências e Tratamento em Sistemas Embarcados

Overflow de Timer: Mecanismo, Consequências e Tratamento em Sistemas Embarcados

Um overflow de timer ocorre quando um registrador contador/timer de hardware atinge seu valor máximo ($2^N - 1$ para N bits) e rola para zero no próximo pulso de clock. É um evento fundamental e periódico em virtualmente todos microcontroladores (MCUs), SoCs e kernels RTOS.

O Mecanismo

  • Contador: Registrador free-running incrementado por fonte de clock ($f_{clk}$ ou $f_{clk}$/Prescaler).
  • Largura: 8-bit (256), 16-bit (65.536), 32-bit (4,29B), 64-bit.
  • Período ($T_{ovf}$): $T_{ovf} = \frac{2^N}{f_{count}}$.
    • Exemplo: 16-bit, clock 1 MHz $\rightarrow$ $T_{ovf} = 65,536 \text{ ms}$.
    • Exemplo: 32-bit, 100 MHz $\rightarrow$ $T_{ovf} = 42,9 \text{ s}$.
  • Flag/Interrupção: Hardware seta Flag de Overflow (TOV / UIF). Gera Requisição de Interrupção (IRQ) se habilitado (TOIE).

Consequências de Overflow Não Tratado

Domínio Modo de Falha
Controle de Tempo (RTC / SysTick) Tempo salta para trás / wraparound. `millis()` rola (Arduino: 49,7 dias). `gettimeofday()` corrompido se ISR perdida.
PWM / Comparação de Saída Glitch se valor TOP não atualizado atomicamente com buffer. Erro ciclo de trabalho por um período.
Captura de Entrada / Largura de Pulso Período medido $>$ $T_{ovf}$ $\rightarrow$ Ambiguidade (contagem overflow perdida). Requer contador de overflow SW.
Escalonador RTOS (SysTick) Perda de tick $\rightarrow$ Deriva temporização tarefas, deadlines perdidos, inversão prioridade.
Segurança / Cripto Fonte entropia falha. Vazamento canal lateral timing se overflow previsível.
Y2K38 / `time_t` 32-bit Overflow epoch Unix 19 Jan 2038. Não HW timer, mas mesma matemática.

Estratégias de Tratamento (Firmware)

1. Extensão de Largura em Software (Prática Padrão)

// Timer HW 16-bit $\rightarrow$ Tempo Sistema 32/64-bit
volatile uint32_t overflow_count = 0;

ISR(TIMER_OVF_vect) {
  overflow_count++;
}

uint64_t get_time_us() {
  uint8_t sreg = SREG; cli();
  uint16_t hw = TCNT1;
  uint32_t ovf = overflow_count;
  SREG = sreg;
  // Tratar race: if (TIFR & TOV) ovf++; hw = TCNT1;
  return ((uint64_t)ovf << 16) | hw;
}

2. Reset Periódico / Recarga (Modo Auto-Reload / Periódico)

  • Defina Registrador Auto-Reload (ARR / TOP / PRD) = Período Desejado - 1.
  • Timer conta 0 $\rightarrow$ ARR $\rightarrow$ 0. Sem flag de overflow (ou flag = Match Período).
  • Usado para: SysTick (1ms), Período PWM, Trigger ADC, Tick RTOS.
  • Elimina ambiguidade de overflow; define período exato.

3. Captura de Entrada com Contagem de Overflow

  • No Evento Captura: Leia Timer ($T_{cap}$) + Leia/Incremente Contador Overflow ($N_{ovf}$).
  • Tempo Total = $(N_{ovf} \times 2^N + T_{cap}) / f_{count}$.
  • Leitura atômica de (Contador + Overflow) crítica (Suporte HW: registrador captura 32-bit incluindo bits overflow, ou double-read com verificação flag).

4. Contadores Free-Running de Alta Resolução / 64-bit

  • ARM Cortex-M DWT CYCCNT (32-bit @ freq CPU).
  • RISC-V `mtime` / `mtimeh` (64-bit memory-mapped).
  • x86 TSC (Time Stamp Counter) (64-bit, invariante).
  • Período overflow = Séculos. Efetivamente "sem overflow" para vida útil do sistema.

5. Compensando Deriva de Clock (Calibração)

  • Tolerância oscilador ($\pm 50$ ppm cristal, $\pm 1-2\%$ RC).
  • Sincronismo periódico com referência externa (GPS PPS, NTP, IEEE 1588 PTP, Cruzamento Zero Rede).
  • Ajuste `ARR` ou fator escala software dinamicamente.

Melhores Práticas

  1. Use Modo Auto-Reload para tarefas periódicas (SysTick, PWM, Laços Controle). Evite free-running overflow a menos que meça intervalos longos.
  2. Leituras Atômicas: Desabilite interrupções / Use LDREX/STREX / Leia duas vezes com verificação flag para valores multi-registrador.
  3. Volatile + Barreiras Memória: Variáveis compartilhadas ISR/Main.
  4. Teste Rollover: Simule overflow (defina contador perto MAX) em CI/HIL. Verifique tratamento rollover `millis()` (histórico bug rollover Arduino `millis()`).
  5. Watchdog: Watchdog independente com janela (IWDT/WWDT) — domínio clock separado — captura falha timer principal.

Conclusão

Overflow de timer não é erro — é uma restrição de projeto. Contadores free-running 32/64-bit modernos tornam-no insignificante para cronometragem. Para timers 8/16-bit, extensão software (contador overflow) + acesso atômico é padrão. Para tarefas periódicas, Modo Auto-Reload elimina o conceito inteiramente.