MicroPython:Библиотеки/machine

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Модуль machine — функции для работы с аппаратными элементами плат[1]

Модуль machine содержит специфические функции, связанные с уникальными аппаратными компонентами плат. Большинство функций в этом модуле дают прямой и неограниченный доступ и возможность управлять аппаратными элементами системы (вроде CPU, таймеров, шин и т.д.). Если использовать функционал этого модуля некорректно, это может привести к сбоям, блокировкам и крашам, а в крайних случаях – даже к повреждению аппаратных элементов платы. Небольшое примечание по функциям обратного вызова, которые используются функциями и методами класса в модуле machine: все эти функции обратного вызова должны рассматриваться, как выполняемые в контексте прерываний. Это касается и физических устройств с ID >= 0, и «виртуальных» устройств с отрицательными ID вроде «-1» (эти «виртуальные» устройства – по-прежнему лишь тонкая «прокладка», лежащая поверх реальных аппаратных элементов и реальных аппаратных прерываний). Более подробно читайте в статье «Написание обработчиков прерываний».

Функции, связанные со сбросом

  • machine.reset() – сбрасывает устройство по аналогии с нажатием на кнопку RESET.
  • machine.soft_reset() – выполняет мягкий сброс интерпретатора, удаляя все Python-объекты и сбрасывая кучу Python. Также пытается запомнить способ, с помощью которого пользователь подключался к MicroPython REPL (например, через USB, WiFi или последовательное соединение).
  • machine.reset_cause() – считывает причину сброса. О том, какие значения может вернуть эта функция, читайте ниже в разделе «Константы».

Функции, связанные с прерываниями

  • machine.disable_irq() – отключает запросы на прерывания. Возвращает предыдущее IRQ-состояние, которое нужно воспринимать как скрытое значение. Это возвращенное значение должно быть передано функции enable_irq(), чтобы вернуть прерываниям их исходное состояние – до того, как была вызвана disable_irq().
  • machine.enable_irq(state) – включает запросы на прерывания. В аргументе state нужно задать значение, возвращенное при самом последнем вызове disable_irq().

Функции, связанные с питанием

  • machine.freq() – возвращает частоту CPU в герцах.
  • machine.idle() – значительно снижает частоту CPU («clock gating»). Можно использовать в любой момент с целью снижения энергопотребления на короткие или долгие промежутки времени. Периферийные компоненты продолжат работать, а код снова начнет исполняться сразу после запуска прерывания (на многих портах для этого используются прерывания системного таймера, происходящие с регулярными интервалами периодичностью примерно в миллисекунду).
  • machine.sleep() – эта функция устарела. Вместо нее используйте lightsleep() без аргументов.
  • machine.lightsleep([time_ms]) и machine.deepsleep([time_ms]) – останавливают выполнение кода, пытаясь войти в режим пониженного энергопотребления.

Если задан аргумент time_ms, то это будет максимальная продолжительность сна (в миллисекундах). Если его задано не будет, сон будет длиться бесконечно. Независимо от того, есть таймаут или нет, система в любой момент может начать вновь выполнять код при наличии событий, требующих обработки. Эти события (они же «источники пробуждения») необходимо задать и настроить до перехода в режим сна – это может быть, например, изменение контакта Pin или истечение таймаута RTC. Поведение и энергосберегающие возможности двух этих функций сильно зависят от используемого оборудования, однако они все же обладают некоторыми общими свойствами:

    • При использовании lightsleep() сохраняется и RAM, и состояние системы. При пробуждении система начнет работать с того момента, где она была переведена в режим сна, со всеми рабочими подсистемами.
    • При использовании deepsleep() состояние RAM или какой-то другой системы (например, периферийных компонентов или сетевых интерфейсов), возможно, сохранены не будут. При пробуждении выполнение кода начнется с главного скрипта – как если бы это был аппаратный сброс или включение. Функция reset_cause() вернет machine.DEEPSLEEP, и это можно использовать для того, чтобы различать переход в режим глубокого сна от других причин сброса.
  • machine.wake_reason() – считывает причину пробуждения. О том, какие значения может вернуть эта функция, читайте ниже в разделе «Константы».

Доступность: ESP32, WiPy.

Прочие функции

  • machine.unique_id() – возвращает строку байтов, обозначающую уникальный идентификатор платы/SoC. У разных экземпляров одной и той же платы/SoC эти ID могут варьироваться (если их оборудование допускает такую возможность). Размер ID зависит от оборудования (поэтому, если ID ожидается коротким, используйте подстроку). В некоторых MicroPython-портах ID соответствует MAC-адресу.
  • machine.time_pulse_us(pin, pulse_level, timeout_us=1000000, /) – определяет длину импульса на заданном контакте и возвращает его (в микросекундах). Значением в аргументе pulse_level должно быть «0» (если нужно определить продолжительность импульса в состоянии «0») или «1» (если нужно определить продолжительность импульса в состоянии «1»).

Если текущее значение контакта pin отличается от того, что задано в pulse_level, функция сначала (*) ждет, пока значение на контакте не станет таким же, как в pulse_level, а затем замеряет продолжительность этого импульса. Если значение контакта pin уже равно значению в pulse_level (**), то замер начнется сразу же. В аргументе timeout_us задается таймаут для замера (в микросекундах). Если время, заданное в timeout_us, истекло в ситуации, помеченной одной звездочкой (*), функция вернет «-2», а если в ситуации, помеченной двумя звездочками (**), то «-1».

  • machine.rng() – возвращает 24-битное программно сгенерированное случайное число.

Доступность: WiPy.

Константы

  • machine.IDLE, machine.SLEEP и machine.DEEPSLEEP – значения для IRQ-состояния.
  • machine.PWRON_RESET, machine.HARD_RESET, machine.WDT_RESET, machine.DEEPSLEEP_RESET и machine.SOFT_RESET – причины сброса.
  • machine.WLAN_WAKE, machine.PIN_WAKE и machine.RTC_WAKE – причины пробуждения.

Классы

См.также

Ссылки на полезные ресурсы

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