Espressif IDF – Fehlerbehandlung

Last Updated on 7. Januar 2021 by sfambach

Die Fehlerbehandlung in der IDF eine der Kernfunktionalitäten. Auf sie stösst man praktisch in jedem Beipiel-Programm. Deshalb möchte ich an dieser Stelle näher auf sie eingehen.

Alle wichtigen Funktion der IDF geben Fehlercodes zurück. Hierauf kann zum einen manuell reagiert werden (if Bedingung + Eigenes Handling) oder sie können an eine spezielles Macro (Funktion) zur Ausgabe und behandlung weiter geleitet werden

ESP_ERROR_CHECK( int Fehler );
ESP_ERROR_CHECK( funktionDieInstZurückGibt( ParamDerFunktion ) );

In der Praxis sieht das dann meist so aus:

ESP_ERROR_CHECK(gpio_config(&config));
ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, 500000));
ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(500000));

Dieses Verfahren macht den Code zum einen sicherer, da Fehler nicht unterschlagen werden und „ausführliche“ Fehlermeldung erstellt werden. Zum anderen sorgt sie aber auch dafür, dass der Code schlechter lesbar ist. Sicherlich besser lesbar wäre das folgende Vorgehen:

// Ersatz für ESP_ERROR_CHECK(gpio_config(&config));
int error = gpio_config(&config);
ESP_ERROR_CHECK(error);

// Ersatz für ESP_ERROR_CHECK(
// esp_timer_start_periodic(periodic_timer, 500000));
error = esp_sleep_enable_timer_wakeup(500000);
if(error != ESP_OK){
  ESP_ERROR_CHECK(error);
} else {
// mache was anderes
}

Aber keine Angst vor der kurzen Schreibweise, man gewöhnt sich schnell daran. Hier noch die Links zu möglichen Fehlercodes und die ensprechende Doku der IDF

IDF-Fehlercodes

IDF- Fehlerbehandlung

Das Verhalten bei Fehler kann über die Konfiguration beinflusst werden. Normal ist „Print register and reboot“ eingestellt, das nervt aber eher als es hilf. Deswegen haben ich es bei mir auf „Print registers and halt“ eingestellt, dann wird nach dem Fehler angehalten und es ist leichter die Ausgabe zu inspezieren.

idf.py menuconfig

Kleiner Tip im IDF Monitor werden die Codezeilen der Fehler angezeigt.

Angabe der fehlerhaften Datei und Zeile

So sieht der Testcode aus:

Eigenen Fehler können

Wenn eigenen Funktionen auf Fehler laufen können, sollte hier ebenfall eine Fehlermeldung zurück gebene werden. Im besten Fall gibt man eine schon existierende Fehlermeldung zurück. (Beipiel aus der IDF Doku)

sdmmc_card_t* card = calloc(1, sizeof(sdmmc_card_t));
if (card == NULL) {
    return ESP_ERR_NO_MEM;
}
esp_err_t err = sdmmc_card_init(host, &card);
if (err != ESP_OK) {
    // Clean up
    free(card);
    // Propagate the error to the upper layer
    // (e.g. to notify the user).
    // Alternatively, application can define and
    // return custom error code.
    return err;
}

Fazit

Die Fehlerbehandlung der IDF findet breite Anwendung. Der Code wird hierdurch nicht unbeding übersichtlicher bleibt aber schön kurz.

Verwandte Beiträge

Hauptbeitrag

Quellen

IDF-Fehlercodes

IDF- Fehlerbehandlung

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert