SOC-ESP32S3部分:14-错误处理
飞书文档https://x509p6c8to.feishu.cn/wiki/ALkQwHNOEiMm0tkhLV9cT29Qnqf
为了让我们编写的代码更健壮,我们可以给所有带返回状态的函数添加错误处理代码,一旦某些资源初始化失败,可以马上终止程序,避免运行异常,触发不确定的问题。这个错误处理代码就是使用IDF提供的ESP_ERROR_CHECK宏定义。ESP_ERROR_CHECK 宏说明如下:
ESP_ERROR_CHECK 宏用于检查 ESP-IDF API 调用的返回值。如果返回值不是 ESP_OK,宏会记录错误日志并终止程序。这有助于在开发过程中快速定位和处理错误。
#define ESP_ERROR_CHECK(x) do { \esp_err_t err_rc = (x); \if (err_rc != ESP_OK) { \ESP_LOGE(TAG, "error %s: %d", esp_err_to_name(err_rc), err_rc); \abort(); \} \
} while(0)宏实现说明:
do { ... } while(0): 使用 do-while 循环确保宏的行为类似于一个语句块。
esp_err_t err_rc = (x): 将 API 调用的结果存储在 err_rc 变量中。
if (err_rc != ESP_OK): 检查返回值是否为 ESP_OK。
ESP_LOGE(TAG, "error %s: %d", esp_err_to_name(err_rc), err_rc): 如果返回值不是 ESP_OK,记录错误日志。esp_err_to_name(err_rc) 将错误码转换为可读的错误名称。
abort(): 终止程序执行。
使用参考:
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"esp_err_t test_func(void)
{esp_err_t ret = ESP_FAIL;ESP_ERROR_CHECK(ret); // 如果错误码不等于 `ESP_OK`,则打印错误信息,然后调用 `abort()`。ESP_ERROR_CHECK_WITHOUT_ABORT(ret); // 如果错误码不等于 `ESP_OK`,则打印错误信息,不调用 `abort()`。//abort() 函数的主要作用是异常终止当前正在执行的程序return ret;
}void app_main(void)
{vTaskDelay(pdMS_TO_TICKS(5000));test_func();while (1){vTaskDelay(pdMS_TO_TICKS(1000));}
}
定时器代码添加错误处理参考
C
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"esp_err_t test_func(void)
{esp_err_t ret = ESP_FAIL;ESP_ERROR_CHECK(ret); // 如果错误码不等于 `ESP_OK`,则打印错误信息,然后调用 `abort()`。ESP_ERROR_CHECK_WITHOUT_ABORT(ret); // 如果错误码不等于 `ESP_OK`,则打印错误信息,不调用 `abort()`。//abort() 函数的主要作用是异常终止当前正在执行的程序return ret;
}void app_main(void)
{vTaskDelay(pdMS_TO_TICKS(5000));test_func();while (1){vTaskDelay(pdMS_TO_TICKS(1000));}
}