Замороженный MicroPython

В некоторых случаях, особенно при использовании чипов ESP8266 возникают проблемы с нехваткой памяти. Яркий тому пример — использование библиотеки Picoweb для создания web приложений. Исправить эту проблему можно воспользовавшись так называемыми Frozen Modules (на ESP32 так-же можно распаять память (1) (2), этот вариант рассмотрю позже)

Frozen Modules — это пользовательские модули включенные в прошивку, хранящиеся как более эффективный byte-code, который может быть быстро загружен и интерпретирован без дополнительный расходов памяти и времени. Данное решение позволяет писать и запускать более требовательные к ресурсам модули MicroPython. Здесь будет описано как собрать прошивку и включить в нее необходимые для работы модули.

Для сборки необходимо иметь набор инструментов esp-open-sdk который можно установить непосредственно на компьютер либо воспользоваться готовым Docker-контейнером. Мне этот вариант нравится больше, это очень лёгкое и удобное решение, внутри уже имеется все необходимое окружение нужно только выполнить несколько команд. Есть еще нюанс, я являюсь счастливым обладателем устройства на процессоре m1, поэтом у себя собрать ничего не смогу (архитектура и всякое такое 🙁 ). Воспользуюсь VPS на DigitalOcean(реферальная).

Находясь на сервере в каталоге /root загружаю исходники MicroPython:
git clone https://github.com/micropython/micropython.git
далее нужно скопировать c локального компьютера на удаленный сервер необходимые модули в каталог micropython/ports/esp8266/modules, сделать это можно с помощью утилиты scp:
scp -r <project>/lib/* root@<host>:/root/micropython/ports/esp8266/modules
где <project> — путь к проекту, <host> — адрес сервера.
Эта команда скопирует все файлы из папки lib проекта на удаленный сервер в каталог /root/micropython/ports/esp8266/modules

Все действия по подготовке уже выполнены, приступаю к сборке. На сервере перехожу в каталог micropython:
cd micropython/
запускаю контейнер
docker run --rm -v $HOME:$HOME -u $UID -w $PWD larsks/esp-open-sdk make -C ports/esp8266 submodules
здесь скачивается (если не был загружен) и запускается Docker-контейнер который получает доступ к текущему каталогу пользователя выполняя команду make c аргументами -C ports/esp8266 submodules. Это добавит новые модули для проверки о чем свидетельствует вывод в консоли:
make: Entering directory '/root/micropython/ports/esp8266'<br>Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.<br>Updating submodules: lib/axtls lib/berkeley-db-1.xx<br>make: Leaving directory '/root/micropython/ports/esp8266

Следующий шаг превращение встроенных скриптов в byte-code
docker run --rm -v $HOME:$HOME -u $UID -w $PWD larsks/esp-open-sdk make -C mpy-cross
вывод:
make: Entering directory '/root/micropython/mpy-cross'<br>Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.<br>GEN build/genhdr/mpversion.h<br>CC main.c<br>LINK mpy-cross<br>text data bss dec hex filename<br>267869 760 896 269525 41cd5 mpy-cross<br>make: Leaving directory '/root/micropython/mpy-cross'

Далее перехожу в каталог
cd ports/esp8266
выполняю сборку прошивки
docker run --rm -v $HOME:$HOME -u $UID -w $PWD larsks/esp-open-sdk make
вывод:
Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.<br>GEN build-GENERIC/genhdr/mpversion.h<br>MPY pkg_resources.py<br>MPY ulogging.py<br>MPY logging.py<br>MPY p_urequests/<strong>init</strong>.py<br>MPY uasyncio/<strong>init</strong>.py<br>MPY uasyncio/core.py<br>MPY utemplate/source.py<br>MPY utemplate/compiled.py<br>MPY picoweb/<strong>init</strong>.py<br>MPY picoweb/utils.py<br>GEN build-GENERIC/frozen_content.c<br>CC build-GENERIC/frozen_content.c<br>CC moduos.c<br>CC ../../shared/runtime/pyexec.c<br>LINK build-GENERIC/firmware.elf<br>text data bss dec hex filename<br>649840 1012 66384 717236 af1b4 build-GENERIC/firmware.elf<br>Create build-GENERIC/firmware-combined.bin<br>esptool.py v1.2<br>flash 32928<br>.text 30788 at 0x40100000<br>.data 1012 at 0x3ffe8000<br>.rodata 1080 at 0x3ffe8400<br>padding 3936<br>irom0text 617972<br>total 654836<br>md5 0bcf6485b4361dbc434238baf5fa325d

Так выглядит успешно завершившаяся сборка.
В каталоге /root/micropython/ports/esp8266/build-GENERIC лежит собраная прошивка firmware-combined.bin
скопировать ее на локальный компьютер можно так-же с помощью утилиты scp:
scp root@<host>:/root/micropython/ports/esp8266/build-GENERIC/firmware-combined.bin /<local>
где <host> — адрес сервера, <local> — путь к локальному каталогу
Для проверки работоспособности прошиваю в ESP8266, подключаюсь к консоли и делаю импорт модуля который я добавил
import picoweb
Если импорт прошел без ошибок, то можно считать, что все удалось. Более подробная информация о сборке прошивки доступна на github.

«
»

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *