NodeMCU / ESP und Yield.

Hallo,
so langsam lese ich mich ein.
Ein Fallstrick bei der ESP-Programmierung schein ja das Ding mit dem yield zu
sein damit der (die) internen Stacks weiterarbeiten können.
Viele Libs scheinen ja scheinbar schon so gut drauf zu achten das man es im eigenen
Programm vergessen könnte.
Erstaunt war ich über diesen Test :

#include <ESP8266WiFi.h>7

// Beim ESP-12 ist an GPIO2 eine blaue LED
#define LED 1

// Name und Passwort des Access Points
#define SSID "Prostetnik"
#define PASSWORD "b1fxxxxxxxxxxxf"


void setup() {
 delay(1000);
 Serial.begin(9600);
 Serial.println("YieldTest");
 // Benutze einen externen AP
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASSWORD);
  WiFi.config(IPAddress(192, 168, 123, 179), IPAddress(192, 168, 123, 252), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 123, 252));
}

void loop() {

}

Bei der leeren Loop dachte ich eigentlich ich würde ihn schon blockieren.
War aber nicht der Fall. Ich konnte ihn prima weiter anpingen.
Erst als ich ein "while (1)" in die loop gebaut habe ging kein Ping mehr.
Für das yield sorgt anscheinend schon das main.

Wäre es möglich - respektive hat der ESP dafür Resourcen - in einem Timerinterrupt
alle 20ms yield auf zu rufen. Dann könnte man es nicht mehr vergessen !

Ulli

Bei der leeren Loop dachte ich eigentlich ich würde ihn schon blockieren.
War aber nicht der Fall. Ich konnte ihn prima weiter anpingen.
Erst als ich ein "while (1)" in die loop gebaut habe ging kein Ping mehr.
Für das yield sorgt anscheinend schon das main.

Wenn dich das wundert, dann: Doku nicht gelesen.
Tue das doch bitte.
Denn da steht drin, wie sich delay() yield() und loop() verhalten.

Wäre es möglich - respektive hat der ESP dafür Resourcen - in einem Timerinterrupt
alle 20ms yield auf zu rufen. Dann könnte man es nicht mehr vergessen !

Nein!
Wilde Dinge in ISR zu tun ist bei einem ESP genauso, wie bei einem AVR, verboten.
bzw. dann knallt es.

Bitte betrachte yield() nicht als Feind.
Sondern begrüße es wie einen Freund.

Übrigens, in ca 2,5 Jahren ESP musste ich eigentlich noch nie yield() schreiben.(ganz wenige Ausnahmen)
Der Trick: Sorge dafür, dass loop schnell durchlaufen wird.

Übrigens:
Es fällt mir schwer zu glauben, dass du eine Timer ISR etablieren kannst.
:smiling_imp: Träume sind Schäume. :smiling_imp:

Nachtrag: Die Doku

Bei der MySQL-Direktzugriffslib habe ich in 2 Schleifen ein yield() rein gesetzt. Die Lesen, bis ein Timeout passiert und ich musste den Timeout hoch setzen, da mein Provider manches Mal nicht so schnell ist.
Ich wollte nicht die Lib neu schreiben.

Gruß Tommy

combie:
Es fällt mir schwer zu glauben, dass du eine Timer ISR etablieren kannst.

??

Ulli

beeblebrox:
??

Keine Frage!
Ich kann mich täuschen!
Zeigs mir....

Übrigens ist das eine Dumme Idee, das tun zu wollen.(schätze ich mal)
Denn damit hättest du dir gleichzeitig den WatchDog unwirksam gemacht.

#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
}

#define LED 1

// Name und Passwort des Access Points
#define SSID "Prostetnik"
#define PASSWORD "b1???????????????"

os_timer_t myTimer;

volatile bool haveTick;

void myTick(void *pArg) 
{
  haveTick = true;
} // End of timerCallback


void setup() {
 delay(1000);
 Serial.begin(9600);
 Serial.println("YieldTest");
 WiFi.mode(WIFI_STA);
 WiFi.begin(SSID, PASSWORD);
 WiFi.config(IPAddress(192, 168, 123, 179), IPAddress(192, 168, 123, 252), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 123, 252));
 pinMode(LED, OUTPUT);
 digitalWrite(LED, HIGH);

 haveTick = false;
 os_timer_setfn(&myTimer, myTick, NULL);
 os_timer_arm(&myTimer, 1000, true);
}

void loop() 
{

 if (haveTick)
 {

   digitalWrite(LED,! digitalRead(LED));
   haveTick = false;

 }

}

Da habe ich mich wahrscheinlich nur einen eh' laufenden Timer "aufgehookt".
Lese mich ja gerade erst ein.
Läuft aber prima. Die LED blinkt im Sekundentakt und anpingen kann ich
den Kollegen auch noch.

Hier herrscht schon manchmal ein komischer Ton.
Man hat eine Frage (weil man in diesem Thema neu ist) und schon werden grundsätzliche
Fähigkeiten in Frage gestellt.
Ich habe hier schon Schaltungen + Software gezeigt die wohl gezeigt haben das ich
weis was ein Interrupt ist und wie man mit ihm umgehen sollte.
(MCP-Keyboard + Lc-Display).

Das es wahrscheinlich keine gute Idee ist aus dem Interruptkontext heraus zu versuchen
die Grundfunktionen des ESP die nonpräemtiv im Vordergrund laufen (so quasi zwischen den
loop) war mir eigentlich klar, aber ich dachte "frasch' se ma".

Erinnert mich alles damals an meine SD-Kartenprobleme (die letztendlich an einer
versehentlich eingschleppten Lib mit BUG lagen). Da hatte ich genau beschreiben
was ich alles ausprobiert hatte und kriege als Antwort "ich solle nicht jammern sondern
das und das und das probieren". Hatte ich alles gemacht bevor ich hier gefragt habe und
das auch mit beschrieben.
Na ja, man soll nicht pingelig sein.

Trotzdem Danke
Ulli

Hier herrscht schon manchmal ein komischer Ton.
Man hat eine Frage (weil man in diesem Thema neu ist) und schon werden grundsätzliche
Fähigkeiten in Frage gestellt.

ICH traue MIR keine Verwaltung des Hardwaretimers des ESP zu.
Und dann darf ich mich auch wundern, wenn du meinst, als ESP Anfänger, das zu können.
Ich wolle mein Erstaunen zum Ausdruck bringen.

Wenn du möchtest, dann darfst du das natürlich als persönlichen Angriff, oder als Herabwürdigung, auffassen. Aber dann solltest du dir bewusst sein, dass das nur in deinem Kopf so entsteht. Denn ich habe es so nicht gemeint.

Ich habe hier schon Schaltungen + Software gezeigt die wohl gezeigt haben das ich
weis was ein Interrupt ist und wie man mit ihm umgehen sollte.

Habe ich mit keiner Silbe, mit keinem Gedanken, in Frage gestellt.
Nur ist das mit dem ESP eine etwas andere Baustelle.

Erinnert mich alles damals an meine SD-Kartenprobleme (die letztendlich an einer
versehentlich eingschleppten Lib mit BUG lagen). Da hatte ich genau beschreiben
was ich alles ausprobiert hatte und kriege als Antwort "ich solle nicht jammern sondern
das und das und das probieren". Hatte ich alles gemacht bevor ich hier gefragt habe und
das auch mit beschrieben.
Na ja, man soll nicht pingelig sein.

Meinst du mich?
Und diesen Thread
Da habe ich mit aller, mir zur Verfügung stehenden, Macht versucht, dir bei dem Problem zu helfen.
Tut mir leid, wenn dich das verletzt hat.

Ich glaube das Problem liegt tiefer.
Als Fakt setze ich mal: Wir beide unterscheiden uns.
Zeigen tut sich das an der Herangehensweise.
Bewerten, welche besser ist, will ich gar nicht.
Nur das "Anders" betonen.

Warum nicht bewerten?
Dein Verhalten hat dir bis jetzt das Überleben gesichert.
Also kann es nicht gänzlich falsch sein!

Trotzdem gibt es in einem Punkt Kollisionen zwischen uns.

Meiner Einschätzung nach, hat es mit dem unterschiedlichen Umgang mit "Unbekannten" zu tun.

Beschreibung:
Wir Menschen können gar nicht die allumfassende Realität erfassen.
Zu wenig Sinne, Zeit, Hirnkapazität usw.
Unser Nervensystem ist darauf ausgerichtet auch mit unbekannten Fakten zu agieren.
Unsere Fantasie neigt dazu, die unbekannten Gebiete auszufüllen.

Bei uns in der Programmierung sind das: Annahmen. Willkürliche Annahmen.

Im SD Karten Thread, die Annahme, dass nichts geändert wurde.
Die hat mich gestört(das hat sich aber erst viel später gezeigt). Denn die hat verhindert, dass du die notwendigen Fakten im Posting gezeigt hast. So hast du die Fakten, die notwendigen, vor dir und gleichzeitig auch vor uns geheim gehalten.
Ja, vielleicht war ich da etwas grob.
Aber wachrütteln ist immer etwas grob.

Mein Tipp, beim nächsten mal, in solchen Dingen:

Frage dich, wo du Annahmen getroffen hast!
Separiere dazu alle Annahmen.
Prüfe sie einzeln gegen die Realität.

Hier ist es die Annahme, das man den Timer programmieren könnte.
Ja, im Grunde kann man das...
Aber:
Die Software Schnittstelle zum Timer hast du ja schon gefunden.
Das Problem:
Das Gedöns steckt in den vorgefertigten Binärcode Libs (ESP SDK).
Da kommen wir nicht so einfach ran.
Und eine Veränderung, an der Stelle, birgt die Gefahr, dass wir uns weitere Funktionalitäten dabei abschießen.
Das wollen wir doch nicht! Oder?

--

Ist es falsch Annahmen zu treffen?
Ich glaube nicht.
Ich schätze, das ist unvermeidbar, weil wir so gestrickt sind.
Aber dennoch habe ich mir weit oben auf meiner Fahne geschrieben, mich bei allen willkürlichen Annahmen zu erwischen. Interessanter Weise führt das dazu, dass ich solche Annahmen bei anderen, z.B. bei dir, sehen, hören, sogar schmecken kann.
Leider kann ich sie dann häufig nicht unmittelbar benennen.
Denn der springende Fakt liegt meist erst noch im Dunkel.
Es braucht Zeit und Energie ihn ans Licht zu zerren.

Klarer:
Ich bin der Überzeugung, dass Annahmen sehr häufig Zeit und Energieverschwendung sind.

  1. Erst denkt man sich das falsche dahin.
  2. Dann muss man seinen Irrtum einsehen
  3. Das richtige will gelernt werden.

3 Schritte, wo doch einer reichen würde. :slight_smile:

Naja...
Pingelig alle Annahmen zu überprüfen ist auch Arbeit.
Und, mangels allem, auch gar nicht wirklich zu schaffen.

Alles klar :wink:
Alle Klarheiten beseitigt. Ich war wahrscheinlich einfach zu empfindlich.

Trotzdem danke für die klärenden Worte sowohl fachlich als auch persönlich.

Ok das mit der Komplexität des Interrupthandlings beim ESP sehe ich ein.
Ich hatte ja selber gemutmaßt das ich ja auch nur auf einem Hook hänge und nicht wirklich
Kontrolle darüber habe was passiert.

War halt nur eine Frage ob schon mal jemand versucht hat das yield "nicht vergesslich" zu
implementieren.
Wobei es so schwer nicht sein kann da bei längeren Schleifen dran zu denken. Vor Allem
wo viele Libs das ja scheinbar intern handeln.

Gruß
Ulli

Wobei es so schwer nicht sein kann da bei längeren Schleifen dran zu denken.

Ja, so ist es.
Etwas Sorgfalt und Disziplin, dann geht das schon.