3.3. Liczniki wirtualne¶
Strona Pomiar czasu omówiła znaczniki czasu oraz nieblokujące pętle sterowane przez time.ticks_diff(). Licznik wirtualny to ich druga strona: oprogramowanie prosi środowisko uruchomieniowe o wywołanie funkcji według harmonogramu, a środowisko wywołuje funkcję zwrotną bez konieczności samodzielnego sprawdzania zegara przez skrypt.
3.3.1. Klasa machine.Timer¶
machine.Timer tworzy licznik wirtualny. Zachowanie niezależne od portu wymaga specjalnego id -1; wszystko inne – okres, tryb, funkcja zwrotna – ustawia się za pomocą argumentów nazwanych:
from machine import Timer
def tick(t):
print("tick")
tim = Timer(-1)
tim.init(period=100, callback=tick) # 10 Hz
Funkcja zwrotna jest wywoływana jak każde zwykłe wywołanie funkcji – może alokować obiekty, używać print() oraz wywoływać inny kod biblioteczny bez żadnych specjalnych ograniczeń.
3.3.2. Tryb okresowy i jednorazowy¶
Dostępne są dwa tryby:
Timer.PERIODIC(domyślny). Funkcja zwrotna uruchamia się coperiodmilisekund, w nieskończoność, dopóki nie zostanie wywołanadeinit()lub licznik nie zostanie ponownie zainicjalizowany.Timer.ONE_SHOT. Funkcja zwrotna uruchamia się raz,periodmilisekund poinit(), a następnie licznik się zatrzymuje.
Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)
deinit() zatrzymuje licznik okresowy i anuluje wszelkie oczekujące wywołania zwrotne:
tim.deinit()
3.3.3. Kiedy sięgnąć po licznik¶
Liczniki wirtualne oraz wzorzec odpytywania z ticks_diff() z Pomiar czasu rozwiązują ten sam problem z przeciwnych kierunków. Odpytywana pętla sprawdza zegar w każdej iteracji i działa, gdy minie wystarczająco dużo czasu; licznik prosi środowisko uruchomieniowe o wybudzenie skryptu, gdy minie wystarczająco dużo czasu.
Odpytywany
ticks_diff. Wszystko pozostaje w jednym miejscu – pętla jest właścicielem pomiaru czasu, nie ma dodatkowych funkcji zwrotnych do śledzenia. Najlepszy do krótkiej, dobrze zdefiniowanej pracy, która wiąże ze sobą kilka zadań sterowanych czasem.Licznik wirtualny. Przenosi harmonogram poza ciało pętli. Najlepszy, gdy zadanie okresowe jest niezależne od głównego przepływu (dioda LED sygnalizująca pracę, okresowa próbka z sensora) i pozwala głównej pętli poświęcić czas na inną pracę.
Oba podejścia używają tego samego zegara bazowego i dają tę samą dokładność przy okresach rzędu milisekundy lub większych. Żadne z nich nie nadaje się do precyzyjnego przełączania pinów ani generowania przebiegów o czasach poniżej milisekundy – opóźnienie funkcji zwrotnej jest rzędu taktu planisty, a nie nanosekund.