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
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.
Kleiner Tip im IDF Monitor werden die Codezeilen der Fehler angezeigt.
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.