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


von Hanspeter (Gast)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.