Panic handler: Use same reset path as esp_restart(), disabling hardware
Closes #223 https://github.com/espressif/esp-idf/issues/223
This commit is contained in:
parent
ee9fb10e29
commit
e53d307814
3 changed files with 22 additions and 4 deletions
|
@ -181,6 +181,9 @@ void set_rtc_memory_crc(void);
|
||||||
/**
|
/**
|
||||||
* @brief Software Reset digital core.
|
* @brief Software Reset digital core.
|
||||||
*
|
*
|
||||||
|
* It is not recommended to use this function in esp-idf, use
|
||||||
|
* esp_restart() instead.
|
||||||
|
*
|
||||||
* @param None
|
* @param None
|
||||||
*
|
*
|
||||||
* @return None
|
* @return None
|
||||||
|
@ -190,6 +193,9 @@ void software_reset(void);
|
||||||
/**
|
/**
|
||||||
* @brief Software Reset digital core.
|
* @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.
|
* @param int cpu_no : The CPU to reset, 0 for PRO CPU, 1 for APP CPU.
|
||||||
*
|
*
|
||||||
* @return None
|
* @return None
|
||||||
|
|
|
@ -320,6 +320,8 @@ static void doBacktrace(XtExcFrame *frame)
|
||||||
panicPutStr("\n\n");
|
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
|
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.
|
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);
|
esp_gdbstub_panic_handler(frame);
|
||||||
#elif CONFIG_ESP32_PANIC_PRINT_REBOOT || CONFIG_ESP32_PANIC_SILENT_REBOOT
|
#elif CONFIG_ESP32_PANIC_PRINT_REBOOT || CONFIG_ESP32_PANIC_SILENT_REBOOT
|
||||||
panicPutStr("Rebooting...\r\n");
|
panicPutStr("Rebooting...\r\n");
|
||||||
for (x = 0; x < 100; x++) {
|
esp_restart_noos();
|
||||||
ets_delay_us(1000);
|
|
||||||
}
|
|
||||||
software_reset();
|
|
||||||
#else
|
#else
|
||||||
disableAllWdts();
|
disableAllWdts();
|
||||||
panicPutStr("CPU halted.\r\n");
|
panicPutStr("CPU halted.\r\n");
|
||||||
|
|
|
@ -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")));
|
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)
|
void IRAM_ATTR esp_restart(void)
|
||||||
{
|
{
|
||||||
esp_wifi_stop();
|
esp_wifi_stop();
|
||||||
|
|
||||||
// Disable scheduler on this core.
|
// Disable scheduler on this core.
|
||||||
vTaskSuspendAll();
|
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 core_id = xPortGetCoreID();
|
||||||
const uint32_t other_core_id = core_id == 0 ? 1 : 0;
|
const uint32_t other_core_id = core_id == 0 ? 1 : 0;
|
||||||
esp_cpu_stall(other_core_id);
|
esp_cpu_stall(other_core_id);
|
||||||
|
|
Loading…
Reference in a new issue