Jetzt habe ich gerade gedacht ich wäre mit meiner Watchdog-Lösung zufrieden da muss
ich feststellen dass das ESP.restart() das ich in der WD-Callback aufrufe nicht jedesmal
arbeitet.
Manchmal landet der ESP danach in einer Endlosschleife in der er ohne Ende etwas in einer
mir nicht bekannte Baud-Rate auf der Seriellen ausgibt.
Auch die Initialisierung von esp_task_wdt_init(WATCHDOG_TIMEOUT,false) auf
esp_task_wdt_init(WATCHDOG_TIMEOUT,true) ändert nichts.
Jetzt habe ich mal einen IO-Pin mit dem Reset(EN) Eingang verbunden und ziehe den im Callback
auf LOW. Klappt bedeuten besser aber auch nicht zu 100%. Manchmal landet er immer noch in der Endlosschleife. Ein weitere Nachteil der Methode ist das der Resettaster (natürlich) nicht mehr geht wenn die Brücke gesteckt ist.
Bei allem Googlen habe ich schon häufig von diesen Problemen gelesen.
Hat jemand eine sichere Lösung ?
Also für meine Begriffe sind das schon verschiedene Themen wenn sie sich auch
auf einen Aspekt beziehen. Die anderen beiden habe ich ja schon auf "gelöst"
gesetzt. Und die Baudrate beim ESP32 ist auch beim Hochlauf normalerweise 115200.
Jetzt habe ich mal im WDT-Callback die Interrupts gesperrt und siehe es funktioniert
wesentlich besser. Aber nicht 100%. Dann habe ich die Resetleitung von GPIO25 zu EN
entfernt und auch den Code für den "Hardwarereset" wieder entfernt so das nur
die erste Version + Interrupts sperren übrig blieb :
#define WATCHDOG_TIMEOUT 3
#define EEPROM_SIZE 1
uint8_t BoraBoot;
//---------------------------------------------------------------------------
// Watchdog routines (name of the dog is Bora :-)
//---------------------------------------------------------------------------
extern "C" void esp_task_wdt_isr_user_handler()
{
portDISABLE_INTERRUPTS();
EEPROM.write(0,(uint8_t) 1);
EEPROM.commit();
ESP.restart();
}
//---------------------------------------------------------------------------
// Setup the Watchdog for three seconds
//---------------------------------------------------------------------------
void BoraSetup()
{
esp_task_wdt_init(WATCHDOG_TIMEOUT,false); //Init Watchdog with 3 seconds timeout
esp_task_wdt_add(NULL);
}
Das scheint bisher gut zu arbeiten.
Ich kann über eine eingebaute WebSeite den Watchdog absichtlich durch Endlosschleife auslösen und werde es jetzt immer mal wieder probieren. Hat bisher 8x hintereinander geklappt. So oft
ging es noch nie.
Ich werde über den hoffentlich endgültigen Erfolg berichten.