ESP32 Watchdog deaktivieren oder triggern?

Gast #6086407
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!
#6086510
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
#6086830
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.

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