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:
Angus Gratton 2017-01-13 14:30:00 +11:00
parent ee9fb10e29
commit e53d307814
3 changed files with 22 additions and 4 deletions

View file

@ -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

View file

@ -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");

View file

@ -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);