Forum: Mikrocontroller und Digitale Elektronik ESP32 Watchdog deaktivieren oder triggern?


von Zonk (Gast)


Lesenswert?

In meinem ArduinoIDE-Sketch für den ESP32 nutze ich nirgends aktiv den 
Watchdog, stolpere aber immer mal über einen Absturz des gesamten Boards 
mit dieser Meldung:
1
Guru Meditation Error: Core  1 panic'ed (Interrupt wdt timeout on CPU1)

Das "wdt timeout" klingt für mich nach Watchdog. Deswegen meine Frage: 
wie kann ich den triggern oder komplett deaktivieren, damit bei länger 
dauernden Operationen nicht das ganze Board abkachelt? Danke!

von Wolfgang (Gast)


Lesenswert?

Zonk schrieb:
> Deswegen meine Frage:
> wie kann ich den triggern oder komplett deaktivieren, damit bei länger
> dauernden Operationen nicht das ganze Board abkachelt?

Teile sie in kürzere Operationen auf.

von Sven B. (sb2048)


Lesenswert?

Wenn du das Arduino Framework nutzt, hilft es, delay(0) immer mal wieder 
aufzurufen.

von Michael U. (amiga)


Lesenswert?

Hallo,

Funktionen, die solange dauern bis der WDT auslöst, bekommt eigentlich 
selten hin.
Kritsch sind Sachen wie das Warten auf eine Änderung an einem Portpin, 
also sowas wie
1
while (digitalRead(Pin) == LOW)
2
{
3
};
4
Da muß dann unbedingt ein delay(90; besser yield(); rein.
5
delay() ruft intern yield(); auf.

Einige Libs, die prinzipiell auf dem ESP32 laufen, sind nicht wirklich 
angepaßt, so das es da natürlich auch intern passieren kann.

Gruß aus Berlin
Michael

von Mike R. (thesealion)


Lesenswert?

Michael U. schrieb:
> Da muß dann unbedingt ein delay(90); besser yield(); rein.
> delay() ruft intern yield(); auf.

Das nützt aber alles nichts, wenn der TE Arduino typisch alles in der 
loop() Funktion erledigt.

Beim ESP32 darf ein Durchlauf der loop nicht zu lang sein, da ansonsten 
ebenfalls der Watchdog triggert. (Auch die loop läuft in einem Thread 
und wenn die zu lange braucht, wird der Thread zum Auslöser.

yield(); statt delay(); klappt auch nur, wenn der problematische Thread 
mindestens die gleiche Priorität hat. Ein Thread mit nieriger Priorität 
bekommt bei yield() nie Rechenzeit. Bei delay() schon, da der aktuelle 
Thread vorübergehend auf blocked wechselt.

von Zonk (Gast)


Lesenswert?

Wolfgang schrieb:
> Teile sie in kürzere Operationen auf.

Wahnsinn was manche Leute hier von sich geben, nur um mal was 
geschrieben zu haben. Ich stelle eine ganz klare Frage ("wie Watchdog 
triggern oder abschalten") und dann kommt sowas hier...

von Zonk (Gast)


Lesenswert?

Sven B. schrieb:
> Wenn du das Arduino Framework nutzt, hilft es, delay(0) immer mal wieder
> aufzurufen.

Michael U. schrieb:
> Da muß dann unbedingt ein delay(90; besser yield(); rein.
> delay() ruft intern yield(); auf.

Funktioniert - Danke! :-)

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.