MicroPython:Библиотеки/micropython: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
Строка 18: Строка 18:
* [[MicroPython:Библиотеки/micropython/micropython.kbd_intr()|micropython.kbd_intr()]]
* [[MicroPython:Библиотеки/micropython/micropython.kbd_intr()|micropython.kbd_intr()]]
* [[MicroPython:Библиотеки/micropython/micropython.schedule()|micropython.schedule()]]
* [[MicroPython:Библиотеки/micropython/micropython.schedule()|micropython.schedule()]]
* micropython.const(expr) – используется, чтобы объявить, что выражение expr является константой, чтобы его можно было оптимизировать при компиляции. Эта функция используется следующим образом:
<syntaxhighlight lang="python" enclose="div">
from micropython import const
CONST_X = const(123)
CONST_Y = const(2 * CONST_X + 1)
</syntaxhighlight>
Константы, объявляемые таким образом, по-прежнему доступны как глобальные переменные за пределами модуля, в котором они были объявлены. С другой стороны, если константа начинается с нижнего подчеркивания, то это скрытая константа.
Она не будет доступна как глобальная переменная, и она не будет занимать память во время выполнения кода.
Функция const() напрямую распознается парсером MicroPython. Кроме того, она является частью модуля micropython во многом для того, чтобы вы могли писать скрипты, запускаемые и под CPython, и под MicroPython – следуя примеру выше.
* micropython.opt_level([level]) – если в этой функции будет задан аргумент level, то она задаст уровень оптимизации для компиляции последующих скриптов и вернет None. Если аргумента level задано не будет, она вернет уровень оптимизации, заданный в настоящий момент.
Уровень оптимизации влияет на следующие функции компиляции:
** Проверка истинности условия: на уровне 0 операторы проверки истинности условия включены и компилируются в байт-код. На уровне 1 и выше операторы проверки истинности условия не компилируются.
** Встроенная переменная __debug__: на уровне 0 эта переменная расширяется до True; на уровне 1 и выше она расширяется до False.
** Номера строчек исходного кода: на уровнях 0, 1 и 2 номера строчек исходного кода сохраняются с байт-кодом, чтобы исключение могло сообщить о строчке кода, в которой оно возникло. На уровне 3 и выше номера строчек не сохраняются.
По умолчанию задан 0-ой уровень оптимизации.
* micropython.alloc_emergency_exception_buf(size) – выделяет в RAM-памяти size байтов (оптимальный вариант – около 100 байтов) для буфера аварийного исключения. Этот буфер будет использоваться для создания исключений в случаях, когда обычное выделение RAM-памяти работать не будет (например, внутри обработчика прерывания), давая полезную диагностическую информацию об этих ситуациях.
Рекомендуем поставить эту функцию в самом начале главного скрипта (например, «boot.py» или «main.py») – в результате буфер аварийного исключения будет активен для всего кода, что будет идти дальше.
* micropython.mem_info([verbose]) – печатает информацию о памяти, используемой в данный момент. Если будет задан аргумент verbose, функция напечатает дополнительную информацию.
Печатаемая информация зависит от используемой реализации, но в данный момент функция печатает количество памяти, используемой в куче и стеке. Если задан аргумент verbose, эта функция напечатает данные обо всей куче с информацией о том, какие блоки используются, а какие – свободны.
* micropython.qstr_info([verbose]) – печатает информацию о строках, интернированных в данный момент. Если будет задан аргумент verbose, функция напечатает дополнительную информацию.
Печатаемая информация зависит от используемой реализации, но в настоящий момент функция печатает количество интернированных строк и количество RAM-памяти, которое они используют. Если будет задан аргумент verbose, функция напечатает названия всех RAM-интернированных строк.
* micropython.stack_use() – возвращает целое число, означающее размер стека, используемый в данный момент. Абсолютное значение этого показателя малополезно – его нужно использовать для расчета разницы в размерах стека в разные моменты времени.
* micropython.heap_lock(), micropython.heap_unlock() и micropython.heap_locked() – выполняют блокировку и разблокировку кучи. Когда куча заблокирована, выделение памяти будет запрещено, но если попытка выделения памяти в куче все же будет предпринята, это вызовет ошибку [http://docs.micropython.org/en/latest/library/builtins.html#MemoryError MemoryError]. Если куча в данный момент заблокирована, функция heap_locked() вернет True.
Эти функции можно вкладывать друг в друга. Вы можете вызвать heap_lock() несколько раз подряд, и это увеличит «глубину» блокировки. То есть, чтобы разблокировать кучу, вам затем нужно столько же раз вызвать функцию heap_unlock().
Функции heap_unlock() и heap_locked() возвращают текущую глубину блокировки в виде неотрицательного целого числа. Возврат «0» будет означать, что куча не заблокирована. Функция heap_unlock() возвращает значение после разблокировки.
Если REPL станет активен, когда куча будет заблокирована, то она будет принудительно разблокирована.
Примечание: На большинстве портов функция heap_locked() по умолчанию не включена, и для ее включения требуется MICROPY_PY_MICROPYTHON_HEAP_LOCKED.
* micropython.kbd_intr(chr) – задает символ, который будет возбуждать исключение [http://docs.micropython.org/en/latest/library/builtins.html#KeyboardInterrupt KeyboardInterrupt]. По умолчанию во время выполнения скрипта здесь задается «3», что соответствует Ctrl+C. Если передать этой функции «-1», это отключит «охоту» на Ctrl+C, а «3» снова её включит.
Эту функцию можно использовать, чтобы перестать вылавливать Ctrl+C во входящем потоке символов (что обычно используется REPL) – в случае, если поток используется для каких-то других целей.
* micropython.schedule(func, arg) – планирует «очень скорое» выполнение функции func. В аргументе arg задается единственный аргумент функции func. Фраза «очень скорое» означает, что среда выполнения MicroPython сделает все возможное, чтобы запустить функцию func как можно быстрее. В то же время schedule() не будет запускать функцию func «на горячую голову» – для этого должны быть соблюдены следующие условия:
** Запланированная функция никогда не будет запущена до другой запланированной функции.
** Запланированные функции всегда выполняются «между кодами операций», что значит, что все фундаментальные Python-операции (вроде добавления элемента к списку) гарантированно останутся атомарными (нераздельными).
** В некоторых портах могут быть «критические участки» кода, внутри которых запланированные функции никогда выполняться не будут. Функции могут быть запланированы внутри критического участка, но не будут выполнены, пока не будет совершен выход из этого участка. К примеру, критическим участком кода может быть обработчик прерывания (запрос на прерывание или IRQ).
Эта функция используется для планирования запуска функций обратного вызова из обработчика прерывания. Есть ряд ограничений на код, запускаемый внутри прерываний (например, может быть заблокирована куча), и планирование функции на более поздний запуск позволяет эти ограничения обойти.
Примечание: Если schedule() вызывается из прерывания, в котором выделение памяти не разрешено, а функция обратного вызова передается schedule() в виде привязанного метода, то эта прямая передача закончится неудачей. Причина в том, что создание указателя на связанный метод ведет к выделению памяти. Решение в том, чтобы создать указатель на метод в конструкторе класса и передать этот указатель в функцию schedule(). Более подробно об этом рассказывается [http://docs.micropython.org/en/latest/reference/isr_rules.html#isr-rules в статье «Написание обработчиков прерываний» в разделе «Создание Python-объектов»].
Очередь планируемых функций в schedule() не бесконечна, и если она будет переполнена, это выдаст ошибку RuntimeError.


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python" enclose="div">

Версия от 19:46, 20 сентября 2020

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


Модуль micropython – доступ и управление «нутрянкой» MicroPython[1]

Функции

<syntaxhighlight lang="python" enclose="div">

См.также

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