]> granicus.if.org Git - esp-idf/commitdiff
Panic handler: Use same reset path as esp_restart(), disabling hardware
authorAngus Gratton <angus@espressif.com>
Fri, 13 Jan 2017 03:30:00 +0000 (14:30 +1100)
committerAngus Gratton <angus@espressif.com>
Fri, 13 Jan 2017 03:37:36 +0000 (14:37 +1100)
Closes #223 https://github.com/espressif/esp-idf/issues/223

components/esp32/include/rom/rtc.h
components/esp32/panic.c
components/esp32/system_api.c

index e3c031775d71a730453f53e7d44050c473d04ffd..9bcd9bd7e005d40130c8940bdb6b60fd71fc43c6 100644 (file)
@@ -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
index c5b18870a939afc05b662de857f133b12c117ab0..dcf7ba8d7e8d2ca53790f5780ed57d9c6e79b19a 100644 (file)
@@ -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");
index 60fa1796cdcabfe5135f4e1aa57c63cd2512629d..55fe026591ecc7166c60dc6c7d94a3627af88d88 100644 (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")));
 
 
+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);