Функции

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()