3.3. Temporizatoare virtuale¶
Pagina Temporizare a acoperit marcajele temporale și buclele neblocante conduse de time.ticks_diff(). Un temporizator virtual este reversul: software-ul cere runtime-ului să apeleze o funcție conform unui program, iar runtime-ul invocă funcția de retroapelare (callback) fără ca scriptul să fie nevoit să verifice el însuși ceasul.
3.3.1. Clasa machine.Timer¶
machine.Timer construiește un temporizator virtual. Comportamentul între porturi necesită id-ul special -1; orice altceva – perioadă, mod, callback – se setează prin argumente cu cuvinte cheie:
from machine import Timer
def tick(t):
print("tick")
tim = Timer(-1)
tim.init(period=100, callback=tick) # 10 Hz
Funcția de retroapelare (callback) este invocată ca orice apel obișnuit de funcție – poate aloca obiecte, poate apela print() și poate apela alt cod de bibliotecă fără nicio restricție specială.
3.3.2. Periodic și unic¶
Sunt disponibile două moduri:
Timer.PERIODIC(implicit). Funcția de retroapelare se declanșează la fiecareperiodmilisecunde, la nesfârșit, până când se apeleazădeinit()sau temporizatorul este reinițializat.Timer.ONE_SHOT. Funcția de retroapelare se declanșează o singură dată, laperiodmilisecunde dupăinit(), iar apoi temporizatorul se oprește.
Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)
deinit() oprește un temporizator periodic și anulează orice funcție de retroapelare în așteptare:
tim.deinit()
3.3.3. Când să recurgeți la un temporizator¶
Temporizatoarele virtuale și modelul de interogare cu ticks_diff() din Temporizare rezolvă aceeași problemă din direcții opuse. O buclă interogată verifică ceasul la fiecare iterație și acționează când a trecut suficient timp; un temporizator cere runtime-ului să trezească scriptul când a trecut suficient timp.
Interogat
ticks_diff. Totul rămâne într-un singur loc – bucla deține temporizarea, fără funcții de retroapelare suplimentare de urmărit. Cel mai bun pentru sarcini scurte, bine definite, care leagă împreună mai multe sarcini conduse de timp.Temporizator virtual. Mută programul în afara corpului buclei. Cel mai bun atunci când sarcina periodică este independentă de fluxul principal (un LED de tip heartbeat, un eșantion periodic de la senzor) și permite buclei principale să își petreacă timpul pe alte sarcini.
Ambele abordări folosesc același ceas de bază și oferă aceeași acuratețe la perioade de o milisecundă sau mai mult. Niciuna nu este potrivită pentru comutarea precisă a pinilor sau generarea de forme de undă sub-milisecundă – latența funcției de retroapelare este de ordinul ticului planificatorului, nu de nanosecunde.