ESP leerer Loop... mit oder ohne yield() ??

Hi Leute

Ich habe folgenden umfangreichen Code :grinning: auf meinen ESP-01S gezimmert…

#include <ESP8266WiFi.h>

void setup() {
	WiFi.disconnect();
	WiFi.mode(WIFI_OFF);
	WiFi.forceSleepBegin();

	delay(10);

	tone(2, 500);
}

void loop() {
}

…jetzt wollte ich mal fragen was Ihr empfehlen würdet.
Ist ein “yield();” im “loop” angebracht oder nicht. Man ließt immer nur, wenn man den Code für längere Zeit (> 20ms) anhält, kann es Schwierigkeiten geben und es sollte ein yield() eingefügt werden, wobei diese Funktion ja mittlerweile schon in der “delay” Routine untergebracht ist.
Mein Loop ist aber leer und der ESP hat eigentlich nix zu tun, daher die Frage, ist hier ein yield() im Loop angebracht oder nicht???

Der ESP dient nur als Taktgeber für einen Arduino, da diese rel. instabil laufen und ich rel. genaue Messungen im Millisekunden Bereich durchführen muss. Der Arduino erreicht somit einen Tages-Drift (24h) von ca. 1 Sekunde, was selbst originale aktuelle Arduinos (in meinem Fall ein Nano) nicht schaffen. Der ESP läuft da um Längen stabiler, auch bei Temp.-Schwankungen.
…soviel aber nur nebenbei. :wink:

Gruß & Danke, Sky

Nein!

yield() wird im Hintergrund bei jedem loop() Durchlauf aufgerufen.

(das kann man auch im Quelltext nachschauen)

Oh super... das wusste ich nicht. Dann ist also alles perfekt und ich brauch mir keine Gedanken machen, das der ESP zwischendurch mal abgurkt und in einen Reboot geht.

...Gruß & Danke

Könntest Du mir evtl. noch verraten, wo genau ich das im Core finden kann… hab es beim Stöbern durch die vielen Dateien nicht gefunden. :slightly_frowning_face:

core_esp8266_main.cpp
Der loop_wrapper() ruft loop() run_scheduled_functions() und esp_schedule() auf.

esp_schedule() <<-- das ist der wichtige!
Wird auch von __yield() aufgerufen.

Ich muss mich also korrigieren, yield wird nicht aufgerufen, aber das entsprechende getan.

Alles klar, Danke.

Den "loop_wrapper" habe ich auch gesehen, der ruft als letzten Punkt das "esp_schedule" auf. Es gibt aber noch das "esp_yield".
Na dann hoffe ich mal, das Du recht hast. :wink: Aber ich bin ja noch am Testen und werde das einfach beobachten. (Wobei es ja auch nicht das Thema wäre, das yield in den loop mit einzufügen, aber ich wollt es schon ganz gern wissen.) :sunglasses:

...Gruß, Sky

handle any pending events each time the loop() function completes,

Aus: Reference — ESP8266 Arduino Core 3.0.2-22-gac4af38c documentation

Okay, ich glaube, jetzt hab ich's soweit verstanden. :wink:
Also zusammenfassend kann man sagen...

  • prinzipiell geht es um TCP/IP und WiFi Sachen, die abgearbeitet werden müssen (fällt bei mir ja eh weg)
  • bei jedem Loop Ende wird dies sowieso getan
  • Code-Sequenzen, die in ihrer Abarbeitung länger als 50ms benötigen (sofern sie nicht die delay Routine enthalten) sollten vermieden werden

skyifx:

  • Code-Sequenzen, die in ihrer Abarbeitung länger als 50ms benötigen (sofern sie nicht die delay Routine enthalten) sollten vermieden werden

oder eben yield() enthalten, ggf. sogar mehrere an verschiedenen Stellen. Gerne auch in Schleifen