3.3. Віртуальні таймери¶
Сторінка Таймінг описувала мітки часу та неблокуючі цикли на основі time.ticks_diff(). Віртуальний таймер – це зворотний підхід: програма просить рантайм викликати функцію за розкладом, а рантайм сам запускає зворотний виклик – скрипту не потрібно самостійно перевіряти годинник.
3.3.1. Клас machine.Timer¶
machine.Timer створює віртуальний таймер. Для сумісності між портами потрібно використовувати спеціальний id -1; все інше – period, mode, callback – задається через іменовані аргументи:
from machine import Timer
def tick(t):
print("tick")
tim = Timer(-1)
tim.init(period=100, callback=tick) # 10 Hz
Зворотний виклик запускається як звичайний виклик функції – він може виділяти об’єкти, викликати print() та інший бібліотечний код без жодних спеціальних обмежень.
3.3.2. Periodичний та одноразовий¶
Доступні два режими:
Timer.PERIODIC(за замовчуванням). Зворотний виклик спрацьовує кожніperiodмілісекунд нескінченно, поки не буде викликаноdeinit()або таймер не буде переініціалізовано.Timer.ONE_SHOT. Зворотний виклик спрацьовує один раз, черезperiodмілісекунд післяinit(), а потім таймер зупиняється.
Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)
deinit() зупиняє periodичний таймер і скасовує будь-який відкладений зворотний виклик:
tim.deinit()
3.3.3. Коли варто використовувати таймер¶
Віртуальні таймери та патерн опитування з ticks_diff() зі сторінки Таймінг розв’язують одну й ту саму проблему з різних боків. Цикл опитування перевіряє годинник при кожній ітерації і діє, коли пройшло достатньо часу; таймер просить рантайм розбудити скрипт, коли пройде достатньо часу.
Опитування
ticks_diff. Все зосереджено в одному місці – цикл керує таймінгом, немає додаткових зворотних викликів для відстеження. Найкраще підходить для короткої, чітко визначеної роботи, що об’єднує кілька задач із часовою прив’язкою.Віртуальний таймер. Виносить розклад за межі тіла циклу. Найкраще підходить, коли periodична задача не залежить від основного потоку виконання (мерехтіння «серцебиття» світлодіода, periodичне вимірювання датчика) і дозволяє головному циклу зосередитися на іншій роботі.
Обидва підходи використовують той самий базовий годинник і забезпечують однакову точність при periodах від мілісекунди і більше. Жоден із них не підходить для точного перемикання виводів або генерування хвильових форм з тривалістю менше мілісекунди – затримка зворотного виклику порядку такту планувальника, а не наносекунди.