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ах від мілісекунди і більше. Жоден із них не підходить для точного перемикання виводів або генерування хвильових форм з тривалістю менше мілісекунди – затримка зворотного виклику порядку такту планувальника, а не наносекунди.