MicroPython:Библиотеки/micropython/micropython.schedule()

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


micropython.schedule()[1]

  • micropython.schedule(func, arg) – планирует «очень скорое» выполнение функции func. В аргументе arg задается единственный аргумент функции func. Фраза «очень скорое» означает, что среда выполнения MicroPython сделает все возможное, чтобы запустить функцию func как можно быстрее. В то же время schedule() не будет запускать функцию func «на горячую голову» – для этого должны быть соблюдены следующие условия:
    • Запланированная функция никогда не будет запущена до другой запланированной функции.
    • Запланированные функции всегда выполняются «между кодами операций», что значит, что все фундаментальные Python-операции (вроде добавления элемента к списку) гарантированно останутся атомарными (нераздельными).
    • В некоторых портах могут быть «критические участки» кода, внутри которых запланированные функции никогда выполняться не будут. Функции могут быть запланированы внутри критического участка, но не будут выполнены, пока не будет совершен выход из этого участка. К примеру, критическим участком кода может быть обработчик прерывания (запрос на прерывание или IRQ).

Эта функция используется для планирования запуска функций обратного вызова из обработчика прерывания. Есть ряд ограничений на код, запускаемый внутри прерываний (например, может быть заблокирована куча), и планирование функции на более поздний запуск позволяет эти ограничения обойти.

Примечание

Если schedule() вызывается из прерывания, в котором выделение памяти не разрешено, а функция обратного вызова передается schedule() в виде привязанного метода, то эта прямая передача закончится неудачей. Причина в том, что создание указателя на связанный метод ведет к выделению памяти. Решение в том, чтобы создать указатель на метод в конструкторе класса и передать этот указатель в функцию schedule(). Более подробно об этом рассказывается в статье «Написание обработчиков прерываний» в разделе «Создание Python-объектов».

Очередь планируемых функций в schedule() не бесконечна, и если она будет переполнена, это выдаст ошибку RuntimeError.

См.также

Внешние ссылки