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