Micropython Startup Zeit auf ESP8266 / ESP32

OP #7508831
Lesenswert?

Liebe ESP-Fans,

ich baue gerade eine Steuerung, die darauf angewiesen ist, das der ESP sehr schnell hochfährt, da mit einem Signal die Stromversorgung angeschaltet wird und dann ein anderes Signal (was ca. 100ms zeitverzögert kommt) gezählt werden soll. Bei meinen ersten Experimenten hat der Code fast zwei Sekunden benötigt, um ausgeführt zu werden. Durch Optimierungen konnte ich das auf ca. 300ms (bei einem ESP8266) drücken. Ein ESP32 startet naturgemäß schneller. hier lag der Wert deutlich niedriger.

Jetzt kommt die erstaunliche Entdeckung: Die Startzeit variiert sehr stark und hängt von Kopiervorgängen von Dateien auf den ESP ab. Das heißt, wenn ich alle Quellen auf dem ESP lösche und wieder drauf kopiere erhöht sich die Startzeit. Aber noch kurioser ist, dass ab einer gewissen Anzahl von Kopiervorgängen die Zeit wieder schlagartig auf einen kleinen Wert sinkt. Hier die Messwerte für einen ESP32:

MicroPython v1.20.0 on 2023-04-26; ESP32 module with ESP32

  1. Durchlauf: Startup duration = 8 ms
  2. Durchlauf: Startup duration = 10 ms
  3. Durchlauf: Startup duration = 13 ms
  4. Durchlauf: Startup duration = 14 ms
  5. Durchlauf: Startup duration = 16 ms
  6. Durchlauf: Startup duration = 19 ms
  7. Durchlauf: Startup duration = 22 ms
  8. Durchlauf: Startup duration = 23 ms
  9. Durchlauf: Startup duration = 25 ms
  10. Durchlauf: Startup duration = 28 ms
  11. Durchlauf: Startup duration = 30 ms
  12. Durchlauf: Startup duration = 32 ms
  13. Durchlauf: Startup duration = 34 ms
  14. Durchlauf: Startup duration = 37 ms
  15. Durchlauf: Startup duration = 39 ms
  16. Durchlauf: Startup duration = 40 ms
  17. Durchlauf: Startup duration = 43 ms
  18. Durchlauf: Startup duration = 5 ms

Ein Durchlauf besteht immer aus:

1
rm /pyboard/*
2
cp *.py /pyboard/
3
repl
4
Strg-D (soft reboot)

Der Programmcode ist:

1
from time import ticks_diff, ticks_ms, sleep
2
pstart = ticks_ms()
3
from machine import Pin
4

5
# read Configuration
6
POWER_PIN = 14
7

8
power = Pin(POWER_PIN, Pin.OUT)
9
print(f"Startup duration = {ticks_diff(ticks_ms(), pstart)} ms")
10
power.on()
11
sleep(1)
12
power.off()

Hat jemand eine Idee, woran das liegen könnte. Gibt es irgend eine Möglichkeit, den Zustand der kurzen Startup-Zeit direkt zu erreichen? Liegt es eventuell am Filesystem des ESPs. Gibt es so etwas wie eine Formatierung oder Defragmentierung?

Ich freue mich über Tipps oder ähnliche Erfahrungsberichte.

Viele Grüße Haiko

OP #7508894
Lesenswert?

Ja, das war auch mein erster Gedanke. C++ hab ich auch vor Jahren mal geschrieben, aber das Problem ist ja oft nicht die Programmiersprache, sondern die verfügbaren Bibliotheken. Und bis man sich da zurecht gefunden hat ist immer so eine Sache. Also war mein erster Plan, MicroPython etwas Beine zu machen ;-)

Und ja, ich habe auch mit dem mpy-cross ein Kombinat erzeugt. Das interessante: Es ändert überhaupt nichts an der Ausführungszeit. Was ja auch eigentlich klar ist, denn ich müsste dazu die Zeit zwischen Strom an und Ende des Programms messen. Dazu müsste ich aber meinen Versuchsaufbau erweitern. Vielleicht mache ich das, denn es interessiert mich.

Eins ist klar: Imports benötigen extrem viel Zeit. Wenn man aus der Weld der schnellen Maschinen kommt, nimmt man das nicht wahr. Aber ich habe aus den sieben Python-Dateien eine gemacht und damit die Startzeit auf 40% reduziert!

OP #7508922
Lesenswert?

Ich hatte noch einen TinyPICO with ESP32-PICO-D4 mit MicroPython v1.17 on 2021-09-02 in der Schublade. Verblüffend:

Die Ausführungszeit schwankt zwischen 0 und 1ms. Und es gibt nicht dieses Steigerungseffekt. Jetzt wäre zu prüfen, ob es an der Micropython Version oder am Board liegt... ich berichte

OP #7509205
Lesenswert?

Haiko schrieb:

Ich hatte noch einen TinyPICO with ESP32-PICO-D4 mit MicroPython v1.17 on 2021-09-02 in der Schublade. Verblüffend:

Ich habe mal weiter geforscht und siehe da, dieses Verhalten, dass der 'import' unterschiedlich lange braucht ist erst ab der Micropython Version 1.18

Die Version 1.17 importiert viel schneller (1ms bei ESP8266).

Hat jemand ähnliche Beobachtungen gemacht?


Ich werde jetzt mal versuchen mein Projekt mit dieser alten Micropython Version aufzubauen.

OP #7509323
Lesenswert?

Offenbar verwendet Micropython per default das littlefs. Ich habe das mal probehalber auf FAT umgestellt:

1
import os
2
os.umount('/')
3
os.VfsFat.mkfs(bdev)
4
os.mount(bdev, '/')

Das merkwürdige Verhalten ist komplett verschwunden. Auch ein wiederholtes Kopieren und Löschen der Files verändert nicht das Zeitverhalten. Auch bei der Micropthon Version 1.20. Imports gehen jetzt auch sehr viel schneller und benötigen nur noch 4ms (ESP8266). Hat jemand eine Erklärung dafür?

#7509358
Lesenswert?

Hallo Heiko, nur so eine Idee: Du könntest den Python-Code auch mit mpy-cross vor-comilieren: mpy-cross -march=xtensa <file>.py und das .pyc statt des py auf den ESP kopieren. Spart Platz und Laufzeit (hoffe ich). Das funktioniert bei mir außer bei main.py richtig gut. Gruß Gerd

OP #7510843
Lesenswert?

Gerd A. schrieb:

Hallo Heiko, nur so eine Idee: Du könntest den Python-Code auch mit mpy-cross vor-comilieren: mpy-cross -march=xtensa <file>.py und das .pyc statt des py auf den ESP kopieren. Spart Platz und Laufzeit (hoffe ich). Das funktioniert bei mir außer bei main.py richtig gut. Gruß Gerd

Schon probiert und hilft in diesem fall überhaupt nicht. Ich war auch etwas verwundert. Um die richtige Startzeit zu ermitteln, nutzt mein Versuchsaufbau auch gar nicht, denn ich müsste die Zeit zwischen 'Versorgungsspannung an' und 'Programm läuft' messen. Da mich das aber interessiert, werde ich mir wohl mal über ein Messverfahren Gedanken machen.

Übrigens hilft ein Umformatieren der Flash-Disk auf das FAT-Filesystem. Dann ist das Laden von imports konstant schnell.

Viele Grüße Haiko

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren