Forum: Mikrocontroller und Digitale Elektronik [ESP8266] NodeMCU Lua - Callback-Dauer


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hanspeter (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

im Developer-FAQ 
(https://nodemcu.readthedocs.io/en/master/lua-developer-faq/) steht, 
dass ein Task (Callback) nicht länger als 15 ms laufen sollte, da sonst 
verschiedene SDK-Dienste wie Wifi, Netzwerk und anderes (?) nicht mehr 
funktionieren könnten. Mir ist aufgefallen, dass ein erster Aufruf von 
"require()" mit einem leeren Lua-Skript (enthält nur "do" und "end") 
schon über 200 ms dauert. Damit wäre die 15-ms-Regel verletzt.

Ausserdem steht geschrieben, dass ein Watchdog den Controller 
zurücksetzt, wenn ein Callback länger als 500 ms läuft. Bei einem Test 
mit einer Endlosschleife startet der ESP8266 nach ca. 1.9 s neu. Baut 
man ein "require()" in die Schleife ein, läuft die Schleife endlos. 
Während die Schleife läuft (also der Callback nicht beendet ist), ist 
der ESP8266 nicht pingbar. "require()" scheint also den Watchdog 
zurückzusetzen, aber nicht die Kontrolle ans SDK zurückzugeben.

Wie geht man damit um? Wie kann man "require()" so verwenden, dass die 
15-ms-Regel nicht gebrochen wird?

Danke!
Hanspeter

von Joachim S. (oyo)


Bewertung
0 lesenswert
nicht lesenswert
Eventuell zählt die Zeit, die require() benötigt, gar nicht zu den 
besagten 15ms. Während der Abarbeitung des require()-Aufrufs läuft ja 
streng genommen nicht Dein Programmcode, sondern der des 
LUA-Interpreters; möglich, dass der sich automatisch um die kritischen 
Dinge kümmert, die alle paar Millisekunden durchgeführt werden müssen.
Als ich mit NodeMCU LUA gearbeitet habe (ist mittlerweile aber schon 
eine Zeitlang her), habe ich Module bzw. require() jedenfalls exzessiv 
verwendet, jede noch so kleine Funktion etc. in ein eigenes Modul, 
dennoch bekam ich in der Praxis kein einziges Mal Probleme aufgrund 
dieser 15ms.

Falls sich das bei Dir tatsächlich als Problem herausstellen sollte, 
könntest Du evtl. aber auch versuchen, einfach alle benötigten Module 
gleich zu Beginn der init.lua per require() zu laden. Zu diesem 
Zeitpunkt dürften die zeitkritischen Sachen wie WiFi noch nicht laufen, 
weil Du WiFi ja erst einmal aktivieren musst.
Wenn die benötigten Module nach dem ersten require()-Aufruf dann erst 
einmal im Modul-Cache sind, sollten spätere require()-Aufrufe für 
bereits im Modul-Cache vorhandene Module quasi keine Zeit benötigen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.