Module freezing for Genuine MicroPython

Es gibt ja schon den Beitrag MicroPython module freezing for Pycom devices, da geht es aber nur um die Pycom Geräte und auch ‘nur’ um die Kompilierung zu Bytecode, ohne die Module in die Firmware einzufrieren. Da ist bei den ESPs der Geschwindigkeitsvorteil leider nur gering (bei mir von 22s -> 16s bis der terkin zuckt).

Man kann aber auch Module direkt in die Firmware backen. Das wird z.B. hier (Adafruit) beschrieben. Da gab es auch vor kurzem eine kleine Änderung (manifests), das von Peter Hinch bei fastbuild - Pull and build Pyboard firmware under Linux schön erklärt wird.

Habe ich auch alles gemacht. Terkin wurde vom compiler gefunden und eingebunden. Firmware geflasht, aber leider kann ich nichts importieren.

Hat jemand eine Idee?

help('modules')
__main__          onewire           terkin/network/ble/util             uhashlib
_boot             sys               terkin/network/core                 uheapq
_onewire          terkin/__init__   terkin/network/ip uio
_thread           terkin/api/__init__                 terkin/network/lora                 ujson
_webrepl          terkin/api/http   terkin/network/lte                  uos
apa106            terkin/backup     terkin/network/wifi                 upip
btree             terkin/configuration                terkin/pycom      upip_utarfile
builtins          terkin/datalogger terkin/sensor/__init__              urandom
cmath             terkin/device     terkin/sensor/button                ure
dht               terkin/driver/__init__              terkin/sensor/core                  uselect
ds18x20           terkin/driver/bme280_sensor         terkin/sensor/system                usocket
esp               terkin/driver/ds18x20_sensor        terkin/sensor/touch                 ussl
esp32             terkin/driver/hx711_sensor          terkin/telemetry  ustruct
flashbdev         terkin/driver/max17043_sensor       terkin/util       utime
framebuf          terkin/driver/pytrack_sensor        terkin/watchdog   utimeq
gc                terkin/lib/__init__                 uarray            uwebsocket
inisetup          terkin/lib/hx711  ubinascii         uzlib
machine           terkin/lib/hx711_heisenberg         ubluetooth        webrepl
math              terkin/logging    ucollections      webrepl_setup
micropython       terkin/model      ucryptolib        websocket_helper
neopixel          terkin/network/__init__             uctypes
network           terkin/network/ble/__init__         uerrno
ntptime           terkin/network/ble/pycom            uhashlib
Plus any modules on the filesystem
import bme280_sensor
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: no module named 'bme280_sensor'
1 Like

Hi @poesel,

vielen Dank für Deine Versuche!

Nur anfangs. Später geht es dann auch ums echte “einfrieren” und um die Erzeugung entsprechender Annapurna firmware images, in denen der Großteil des Codes enthalten ist, siehe auch Module freezing for Pycom MicroPython - #12 by Andreas ff. sowie Annapurna firmware images for Pycom/ESP32.

Vielen Dank! Das mit den Manifests hatte ich aufgeschnappt, mich aber noch nicht näher damit beschäftigt, weil das für MicroPython 1.11 noch nicht implementiert ist – richtig?

Ich hatte das damals für Genuine MicroPython noch mit dieser Variante erledigt:

export FROZEN_MPY_DIR=~/dev/hiveeyes/sources/terkin-datalogger/dist-packages

Viele Grüße,
Andreas.

P.S.: Bei Pycom MicroPython klappt es per Build and publish firmware image mit der sync-frozen Implementierung.

War das Deine Stichprobe? Dann müsste es so heißen:

import terkin.driver.bme280_sensor

Vielen Dank nochmals. Ich bin nun der neuen FROZEN_MANIFEST-Methode gefolgt.

Die entsprechende Anleitung dazu gibt es bei Build firmware images. Ein erstes Artefakt (untested!) ist ESP32-SPIRAM-IDF3-20191220-v1.12-Annapurna-0.1.0.bin.

Bei Entwicklung der Terkin-Sandbox - #21 by Andreas steht, wie man das Firmware-Image aufspielt.

Momentan kommt noch:

could not find module '_boot.py'

Nach dem firmware-update müssen noch main.py, boot.py und settings.py aufs board.

10 posts were merged into an existing topic: MicroPython REPL Timeout auf ESP32

Ich hab mal eine Firmware mit /distpackages gebacken. Das klappte auch, inkl. Aufspielen. Allerdings kam dann beim Versuch sie anzustarten folgendes:

E (624) esp_image: Image length 1575648 doesn't fit in partition length 1572864
E (624) boot: Factory app partition is not bootable
E (627) boot: No bootable app partitions in the partition table

P.S.: Ich habe MicroPython hier mit ESP-IDF v4.x verwendet. In Summe wird dann scheinbar alles leider (knapp) zu groß.

Noch ein Test. Erstmal vorweg: ich ahne, warum die firmware bei @clemens nicht läuft [1]. In mp_manifest.py fehlt eine include Zeile. Dadurch fehlt _boot.py und es gibt kein Flashlaufwerk. Es sollte so aussehen:

# FROZEN_MANIFEST file for building firmware images for Genuine MicroPython.
# https://github.com/hiveeyes/terkin-datalogger/blob/master/doc/release.rst#build-firmware-images
include('$(PORT_DIR)/boards/manifest.py')
freeze('dist-packages')
#freeze('lib')

Da mir die Firmware zu groß wurde, habe ich /lib rausgenommen. Außerdem habe ich /lib in /src verschoben, damit ich das mit dem VSC syncen kann.

Hat soweit geklappt. Firmware ist drauf und Terkin startet. Nur leider nicht schneller, sondern noch 3s langsamer. :frowning:
Da kam nach 30 Sekunden auch eine Guru Meditation. Das mag an der fehlenden Hardware liegen oder der idf4. Probiere ich morgen nochmal aus.


  1. MicroPython REPL Timeout auf TTGO/ESP32 ↩︎

1 Like

Verstehe, danke! Gefixt per https://github.com/hiveeyes/terkin-datalogger/commit/fed8bd8ef93f5eb89a9f32dd30b796726cdeb76f.

Das ist wirklich seltsam. Bei mir auf einem FiPy mit 160 MHz im dual core mode startet er selbst mit “nur Bytecode-kompilierten (lib-mpy)” Modulen in knapp 7 Sekunden.

Pyom MicrPython 1.20.2.rc3-0.8.1-vanilla-squirrel-ppp [v1.20.2.rc3-4-g4962aea3b-dirty] on 2020-02-22; FiPy with ESP32
Type "help()" for more information.
>>>
>>>
PYB: soft reboot
[boot.py] INFO: Python module search path is: ['', '/flash', '/flash/lib']
[boot.py] INFO: Universal MicroPython Application Loader (umal)
[umal]    INFO: Python module search path is: ['/flash/lib', '/flash/dist-packages', '/flash/lib-mpy', '']
[main.py] INFO: Loading settings
[main.py] INFO: Starting logging
[main.py] INFO: Loading Terkin Datalogger
[main.py] INFO: Loading modules
    6.4104 [terkin.datalogger           ] INFO   : Starting Terkin datalogger

Andere sagen dazu (just guessing):

A post was split to a new topic: Terkin Firmware Builder for ESP32

Hierzu findet sich im Issue Tracker von Espressif ein interessanter Beitrag.

@poesel: Wegen Random memory corruption faults on ESP32-WROVER rev.1 and rev.2 when running in dual-core mode verwende ich zum Kompilieren der Pycom Firmware eine neue Compiler-Revision von Espressif. Vielleicht klappt es damit auch bei Genuine MicroPython besser.