3.3. Timers virtuais

A página Temporização cobriu timestamps e laços não bloqueantes orientados por time.ticks_diff(). Um timer virtual é o outro lado da moeda: o software pede ao runtime para chamar uma função em um cronograma, e o runtime invoca o callback sem que o script precise verificar o relógio por conta própria.

3.3.1. A classe machine.Timer

machine.Timer constrói um timer virtual. O comportamento entre portas (cross-port) exige o id especial -1; todo o resto – período, modo, callback – é definido por meio de argumentos nomeados:

from machine import Timer

def tick(t):
    print("tick")

tim = Timer(-1)
tim.init(period=100, callback=tick)   # 10 Hz

O callback é invocado como qualquer chamada de função comum – ele pode alocar objetos, usar print() e chamar outro código de biblioteca sem nenhuma restrição especial.

3.3.2. Periódico e disparo único

Dois modos estão disponíveis:

  • Timer.PERIODIC (o padrão). O callback dispara a cada period milissegundos, para sempre, até que deinit() seja chamado ou o timer seja reinicializado.

  • Timer.ONE_SHOT. O callback dispara uma vez, period milissegundos após init(), e o timer então para.

Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)

deinit() para um timer periódico e cancela qualquer callback pendente:

tim.deinit()

3.3.3. Quando recorrer a um timer

Os timers virtuais e o padrão de polling com ticks_diff() de Temporização resolvem o mesmo problema a partir de direções opostas. Um laço com polling verifica o relógio a cada iteração e age quando tempo suficiente se passou; um timer pede ao runtime para acordar o script quando tempo suficiente tiver passado.

  • Polling ticks_diff. Tudo fica em um só lugar – o laço é dono da temporização, sem callbacks extras para acompanhar. Melhor para trabalhos curtos e bem definidos que amarram várias tarefas orientadas por tempo.

  • Timer virtual. Move o cronograma para fora do corpo do laço. Melhor quando a tarefa periódica é independente do fluxo principal (um LED de heartbeat, uma amostragem periódica de sensor) e permite que o laço principal gaste seu tempo em outro trabalho.

Ambas as abordagens usam o mesmo relógio subjacente e oferecem a mesma precisão em períodos de um milissegundo ou mais. Nenhuma é apropriada para alternância precisa de pinos ou geração de formas de onda abaixo do milissegundo – a latência do callback é da ordem do tick do escalonador, não de nanossegundos.