MicroPython:Библиотеки/machine: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{MicroPython/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} <syntaxhighlight lang="python" enclose="div"> =...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=Модуль machine — функции для работы с аппаратными элементами плат<ref>[http://docs.micropython.org/en/latest/library/machine.html docs.micropython.org - machine — functions related to the hardware]</ref>= | |||
Модуль machine содержит специфические функции, связанные с уникальными аппаратными компонентами плат. Большинство функций в этом модуле дают прямой и неограниченный доступ и возможность управлять аппаратными элементами системы (вроде CPU, таймеров, шин и т.д.). Если использовать функционал этого модуля некорректно, это может привести к сбоям, блокировкам и крашам, а в крайних случаях – даже к повреждению аппаратных элементов платы. | |||
Небольшое примечание по функциям обратного вызова, которые используются функциями и методами класса в модуле machine: все эти функции обратного вызова должны рассматриваться, как выполняемые в контексте прерываний. Это касается и физических устройств с ID >= 0, и «виртуальных» устройств с отрицательными ID вроде «-1» (эти «виртуальные» устройства – по-прежнему лишь тонкая «прокладка», лежащая поверх реальных аппаратных элементов и реальных аппаратных прерываний). Более подробно читайте в [http://docs.micropython.org/en/latest/reference/isr_rules.html статье «Написание обработчиков прерываний»]. | |||
== Функции, связанные со сбросом == | |||
* 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 – причины пробуждения. | |||
== Классы == | |||
* [http://docs.micropython.org/en/latest/library/machine.Pin.html Класс Pin – управление I/O-контактами.] | |||
* [http://docs.micropython.org/en/latest/library/machine.Signal.html Класс Signal – управление и считывание данных с внешних I/O-устройств.] | |||
* [http://docs.micropython.org/en/latest/library/machine.ADC.html Класс ADC – аналогово-цифровое преобразование.] | |||
* [http://docs.micropython.org/en/latest/library/machine.UART.html Класс UART – двусторонняя последовательная шина.] | |||
* [http://docs.micropython.org/en/latest/library/machine.SPI.html Класс SPI – протокол шины SPI (со стороны ведущего устройства).] | |||
* [http://docs.micropython.org/en/latest/library/machine.I2C.html Класс I2C – протокол для передачи последовательных данных по 2 линиям.] | |||
* [http://docs.micropython.org/en/latest/library/machine.RTC.html Класс RTC – часы реального времени.] | |||
* [http://docs.micropython.org/en/latest/library/machine.Timer.html Класс Timer – управление аппаратными таймерами.] | |||
* [http://docs.micropython.org/en/latest/library/machine.WDT.html Класс WDT – сторожевой таймер.] | |||
* [http://docs.micropython.org/en/latest/library/machine.SD.html Класс SD – карта памяти типа Secure Digital (только для порта cc3200).] | |||
* [http://docs.micropython.org/en/latest/library/machine.SDCard.html Класс SDCard – карта памяти типа Secure Digital.] | |||
<syntaxhighlight lang="python" enclose="div"> | <syntaxhighlight lang="python" enclose="div"> |
Версия от 20:05, 2 сентября 2020
Модуль 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 – причины пробуждения.
Классы
- Класс Pin – управление I/O-контактами.
- Класс Signal – управление и считывание данных с внешних I/O-устройств.
- Класс ADC – аналогово-цифровое преобразование.
- Класс UART – двусторонняя последовательная шина.
- Класс SPI – протокол шины SPI (со стороны ведущего устройства).
- Класс I2C – протокол для передачи последовательных данных по 2 линиям.
- Класс RTC – часы реального времени.
- Класс Timer – управление аппаратными таймерами.
- Класс WDT – сторожевой таймер.
- Класс SD – карта памяти типа Secure Digital (только для порта cc3200).
- Класс SDCard – карта памяти типа Secure Digital.
<syntaxhighlight lang="python" enclose="div">