Модуль micropython
Контроль над внутренними компонентами MicroPython
Функции
const
Функция const(expr)
Используется для объявления, что выражение является константой, чтобы компилятор мог его оптимизировать.
Использование этой функции выглядит следующим образом:
from micropython import const
CONST_X = const(123)
CONST_Y = const(2 * CONST_X + 1)
Константы, объявленные таким образом, остаются доступными как глобальные переменные извне модуля, в котором они объявлены. Однако, если константа начинается с подчеркивания, то она скрыта, не доступна как глобальная переменная и не занимает память во время выполнения.
Эта функция const
распознается напрямую парсером MicroPython и предоставляется в составе модуля micropython
главным образом для того, чтобы скрипты могли быть написаны так, чтобы они работали как под CPython, так и под MicroPython, следуя описанному выше шаблону.
from micropython import const
PI = const(3.14159)
RADIUS = const(5)
def calculate_area():
return PI * RADIUS * RADIUS
print(calculate_area()) # Вывод: 78.53975
opt_level
Функция opt_level([level])
.
Если указан level, то эта функция устанавливает уровень оптимизации для последующей компиляции скриптов и возвращает None
. Иначе она возвращает текущий уровень оптимизации.
Уровень оптимизации контролирует следующие характеристики компиляции:
- Утверждения (assertions): на уровне 0 утверждения включены и компилируются в байт-код; на уровнях 1 и выше утверждения не компилируются.
- Встроенная переменная
__debug__
: на уровне 0 эта переменная расширяется доTrue
; на уровнях 1 и выше она расширяется доFalse
. - Номера строк исходного кода: на уровнях 0, 1 и 2 номера строк исходного кода сохраняются вместе с байт-кодом, чтобы исключения могли сообщать о номере строки, на которой произошла ошибка; на уровнях 3 и выше номера строк не сохраняются.
По умолчанию уровень оптимизации обычно равен 0.
import micropython
# Установим уровень оптимизации на 1
micropython.opt_level(1)
def debug_example():
if __debug__:
print("Debug mode")
else:
print("Release mode")
debug_example() # Вывод: Release mode
mem_info
Функция mem_info([verbose])
выводит информацию о текущем использовании памяти. Если указан аргумент verbose, то выводится дополнительная информация.
Информация, которая выводится, зависит от реализации, но в настоящее время она включает количество используемого стека и кучи. В расширенном режиме выводится вся куча, показывается, какие блоки заняты, а какие свободны.
import micropython
# Вывод информации о памяти
micropython.mem_info()
# Вывод детальной информации о памяти
micropython.mem_info(True)
qstr_info
Функция qstr_info([verbose])
выводит информацию об интернированных строках в данный момент. Если указан аргумент verbose, то выводится дополнительная информация.
Информация, которая выводится, зависит от реализации, но в настоящее время она включает количество интернированных строк и объём используемой ими памяти. В расширенном режиме выводятся имена всех строк, интернированных в ОЗУ.
import micropython
# Вывод информации об интернированных строках
micropython.qstr_info()
# Вывод детальной информации об интернированных строках
micropython.qstr_info(True)
stack_use
Функция stack_use()
возвращает целое число, представляющее текущий объём используемого стека. Абсолютное значение этой величины не особенно полезно, но оно должно использоваться для вычисления разницы в использовании стека в разных точках.
import micropython
# Получение текущего использования стека
current_stack_use = micropython.stack_use()
print("Использование стека:", current_stack_use)
heap_lock
heap_unlock
heap_locked
Функция heap_lock()
блокирует доступ к куче.
Функция heap_unlock()
снимает блокировку.
При заблокированной куче выделение памяти невозможно и будет вызвано MemoryError
, если будет предпринята попытка выделения кучи.
Функция heap_locked()
возвращает истинное значение, если куча в данный момент заблокирована.
Эти функции могут быть вложены, т.е. heap_lock()
может быть вызван несколько раз подряд, и глубина блокировки будет увеличиваться, а затем heap_unlock()
должен быть вызван столько же раз, чтобы сделать кучу снова доступной.
Обе heap_unlock()
и heap_locked()
возвращают текущую глубину блокировки (после разблокировки для первой) в виде неотрицательного целого числа, с 0, означающим, что куча не заблокирована.
Если REPL становится активным при заблокированной куче, она будет принудительно разблокирована.
Примечание: heap_locked()
обычно не включён по умолчанию в большинстве портов и требует MICROPY_PY_MICROPYTHON_HEAP_LOCKED
.
import micropython
# Блокирование кучи
micropython.heap_lock()
try:
# Попытка выделения памяти приведёт к ошибке
data = bytearray(100)
except MemoryError:
print("Ошибка памяти")
# Разблокирование кучи
micropython.heap_unlock()