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
- Use Modo Auto-Reload para tarefas periódicas (SysTick, PWM, Laços Controle). Evite free-running overflow a menos que meça intervalos longos.
- Leituras Atômicas: Desabilite interrupções / Use LDREX/STREX / Leia duas vezes com verificação flag para valores multi-registrador.
- Volatile + Barreiras Memória: Variáveis compartilhadas ISR/Main.
- Teste Rollover: Simule overflow (defina contador perto MAX) em CI/HIL. Verifique tratamento rollover `millis()` (histórico bug rollover Arduino `millis()`).
- 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.