[ESP8266] NodeMCU Lua - Callback-Dauer

Gast #6290136
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
#6290177
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

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