Hallo Kollegen, nach etlichen erfolglosen Experimenten und eifrigen Suchens habe ich keine befriedigende Antwort auf die WDG Architektur des ESP32 gefunden. Es gibt laut Beschreibung 2 WDG's: einmal für Interrupts und einmal für Tasks. Aber anscheinend keinen WDG, der wie bei anderen µC einen echten HW Reset ausführt. Ich habe auch schon versucht einen WDG mit Timern zu implementieren, was letztlich einen ESP32.reset() auslöst, aber das funktioniert auch nur bedingt. Zum einen setzt die genannte Systemfunktion nicht alle Peripheriebaugruopen zurück und der ESP32 gerät z.B. durch Unterbrechung des WLAN's in einen Zustand, wo nur ein echter Reset hilft. Man könnte natürlich einen externen Baustein dazu verwenden, aber es sollte doch eine Möglichkeit für einen echten WDG on Chip geben. Frage: hab ich was übersehen, oder geht das tatsächlich nicht ? Dake für Eure Hilfe, Gruß Thomas
Thomas M. schrieb: > Es gibt laut Beschreibung 2 WDG's: einmal für Interrupts und einmal für > Tasks. Laut https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/wdts.html gibt es zwei Hardware-Watchdogs, einer in der RTC, ein "Normaler". Die sind durch die HAL und FreeRTOS abstrahiert, das was du als "Interrupt" und "Task"-Watchdog siehst, greift beides auf den MWDT_WDT zu. Und der sollte eigentlich einen "echten" Reset ausführen.
Nee, das hilft leider nicht, weil es sich auch auf den Task WDT bezieht. Aber, ich habe das Problem gelöst: Der Tip mit dem RTC WDT ist korrek t, weil dieses Modul löst entweder für die RTC oder(!) fürs System einen Reset aus. Und nur das macht einen echten Systemreset ! esp_restart() startedt nur die CPU neu, wenn die Peripherie abgeschmiert ist, in meinem Fall das WLAN Modul, ist der ESP32 trotzdem tot. Die SW Lösung ist total easy, aber echt gut versteckt: "https://github.com/espressif/esp-idf/blob/master/components/esp_hw_support/include/rtc_wdt.h" das ist das Headerfile für den RTC_WDT ist die Lösung dokumentiert: Sieht dann so aus: // Initialisierung bei mir auf 10 sec. mit RTC_WDT_TIMEOUT void WatchdogSetup(void){ rtc_wdt_protect_off(); rtc_wdt_disable(); rtc_wdt_set_length_of_reset_signal(RTC_WDT_SYS_RESET_SIG, RTC_WDT_LENGTH_3_2us); rtc_wdt_set_stage(RTC_WDT_STAGE0, RTC_WDT_STAGE_ACTION_RESET_SYSTEM); //RTC_WDT_STAGE_ACTION_RESET_SYSTEM or RTC_WDT_STAGE_ACTION_RESET_RTC rtc_wdt_set_time(RTC_WDT_STAGE0, RTC_WDT_TIMEOUT); // timeout rtd_wdt 7000ms. rtc_wdt_enable(); rtc_wdt_protect_on(); #if(WDG_DEBUG >0) ESP_LOGI(TAG, "!!! ESP WDG INIT !!!!"); #endif } /////////////////////////////////////////////////////////// void WatchdogReset(void) { rtc_wdt_feed(); } wird periodisch bei mir von der NTP Uhr zyklisch aufgerufen. Und das wars wohl, zumindest die Test waren bisher positiv, ich werde das Ganze erst auf einem Knoten eine Weil laufen lassen und dann überall ausrollen. Danke nochmals für die Hilfe, Gruß Thomas
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.