Der ESP32 ist ja ein Dual-Core Mikrocontroller, da läuft die loop() normalerweise als FreeRTOS Task mit niedriger Priorität.
Ich habe einen GPIO mit einem externen Watchdog verbunden. Bei rechenintensiven Tasks (Mbed TLS) wird der GPIO über die loop() nicht immer rechtzeitig getoggelt. Das löst dann einen Reset aus.
Abhilfe habe ich mir verschafft indem das PWM vom LEDC = LED Controller erzeugt wird. Der LEDC läuft unabhängig vom FreeRTOS in Hardware, rechenintensive FreeRTOS Tasks stören den nicht.
CodeBox C
Damit ist der Watchdog aber sinnfrei, denn dieser wird immer bedient, selbst wenn die loop() mal hängt.
Ich suche eine Programmierlösung den ledc mit einem Timer nachzubauen, der genau wie ledc in Hardware läuft, aber mit dem Unterschied dass dieser z.B. nach 10 Sekunden automatisch endet.
Wichtig: Der Timer soll nicht von der loop() gestoppt werden. Die loop() soll den Timer lediglich nachtriggern dürfen.
Ich hatte mir schon einige Gedanken gemacht (programmiert wird der ESP32 in Arduino) aber noch keine Lösung für das Problem gefunden. Habt ihr Ideen, Vorschläge?
Ich habe einen GPIO mit einem externen Watchdog verbunden. Bei rechenintensiven Tasks (Mbed TLS) wird der GPIO über die loop() nicht immer rechtzeitig getoggelt. Das löst dann einen Reset aus.
Abhilfe habe ich mir verschafft indem das PWM vom LEDC = LED Controller erzeugt wird. Der LEDC läuft unabhängig vom FreeRTOS in Hardware, rechenintensive FreeRTOS Tasks stören den nicht.
CodeBox C
void startWatchdog(gpio_num_t wpin, const unsigned long wfreq) {
const unsigned char wchn = 8; // Group 1, Channel 0, Timer 0
const unsigned char wres = 11; // resolution 2048
const unsigned long wduty = (1 << wres) / 2; // 50%
ledcAttachChannel(wpin, wfreq, wres, wchn);
ledcWrite(wpin, wduty);
}
Damit ist der Watchdog aber sinnfrei, denn dieser wird immer bedient, selbst wenn die loop() mal hängt.
Ich suche eine Programmierlösung den ledc mit einem Timer nachzubauen, der genau wie ledc in Hardware läuft, aber mit dem Unterschied dass dieser z.B. nach 10 Sekunden automatisch endet.
Wichtig: Der Timer soll nicht von der loop() gestoppt werden. Die loop() soll den Timer lediglich nachtriggern dürfen.
Ich hatte mir schon einige Gedanken gemacht (programmiert wird der ESP32 in Arduino) aber noch keine Lösung für das Problem gefunden. Habt ihr Ideen, Vorschläge?