ESP32 FreeRTOS Tasks und Hardware Timer

alecxs

Mitglied
28. Juni 2020
52
6
8
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
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?
 
Nun hab ich zunächst erstmal festgestellt dass die o.g. Methode mittels Channel die Gruppe 1 manuell auszuwählen mit dem neuesten Core versagt. Das lässt sich auf diese Änderung zurückverfolgen. Vorher gab es ein fixes Channel Mapping in ledcAttachChannel() Zeile 120, nun wird mit find_matching_timer() und find_free_timer() irgendein Timer dynamisch ausgewählt. Bis v3.2.0 scheint das trotzdem noch zu funktionieren, aber im Zusammenspiel mit späteren Commits wird das Mist.

https://github.com/espressif/arduino-esp32/pull/11452/changes/245074e

Ich hab es erstmal auskommentiert und auf den externen Watchdog verzichtet. Muss mir was neues einfallen lassen.