From e53d307814a9cb5c980c4e6d77496e8635d27c38 Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Fri, 13 Jan 2017 14:30:00 +1100 Subject: [PATCH] Panic handler: Use same reset path as esp_restart(), disabling hardware Closes #223 https://github.com/espressif/esp-idf/issues/223 --- components/esp32/include/rom/rtc.h | 6 ++++++ components/esp32/panic.c | 7 +++---- components/esp32/system_api.c | 13 +++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/components/esp32/include/rom/rtc.h b/components/esp32/include/rom/rtc.h index e3c031775..9bcd9bd7e 100644 --- a/components/esp32/include/rom/rtc.h +++ b/components/esp32/include/rom/rtc.h @@ -181,6 +181,9 @@ void set_rtc_memory_crc(void); /** * @brief Software Reset digital core. * + * It is not recommended to use this function in esp-idf, use + * esp_restart() instead. + * * @param None * * @return None @@ -190,6 +193,9 @@ void software_reset(void); /** * @brief Software Reset digital core. * + * It is not recommended to use this function in esp-idf, use + * esp_restart() instead. + * * @param int cpu_no : The CPU to reset, 0 for PRO CPU, 1 for APP CPU. * * @return None diff --git a/components/esp32/panic.c b/components/esp32/panic.c index c5b18870a..dcf7ba8d7 100644 --- a/components/esp32/panic.c +++ b/components/esp32/panic.c @@ -320,6 +320,8 @@ static void doBacktrace(XtExcFrame *frame) panicPutStr("\n\n"); } +void esp_restart_noos() __attribute__ ((noreturn)); + /* We arrive here after a panic or unhandled exception, when no OCD is detected. Dump the registers to the serial port and either jump to the gdb stub, halt the CPU or reboot. @@ -365,10 +367,7 @@ static void commonErrorHandler(XtExcFrame *frame) esp_gdbstub_panic_handler(frame); #elif CONFIG_ESP32_PANIC_PRINT_REBOOT || CONFIG_ESP32_PANIC_SILENT_REBOOT panicPutStr("Rebooting...\r\n"); - for (x = 0; x < 100; x++) { - ets_delay_us(1000); - } - software_reset(); + esp_restart_noos(); #else disableAllWdts(); panicPutStr("CPU halted.\r\n"); diff --git a/components/esp32/system_api.c b/components/esp32/system_api.c index 60fa1796c..55fe02659 100644 --- a/components/esp32/system_api.c +++ b/components/esp32/system_api.c @@ -72,12 +72,25 @@ esp_err_t esp_efuse_read_mac(uint8_t* mac) esp_err_t system_efuse_read_mac(uint8_t mac[6]) __attribute__((alias("esp_efuse_read_mac"))); +void esp_restart_noos() __attribute__ ((noreturn)); + void IRAM_ATTR esp_restart(void) { esp_wifi_stop(); // Disable scheduler on this core. vTaskSuspendAll(); + + esp_restart_noos(); +} + +/* "inner" restart function for after RTOS, interrupts & anything else on this + * core are already stopped. Stalls other core, resets hardware, + * triggers restart. +*/ +void IRAM_ATTR esp_restart_noos() +{ + const uint32_t core_id = xPortGetCoreID(); const uint32_t other_core_id = core_id == 0 ? 1 : 0; esp_cpu_stall(other_core_id);