diff --git a/components/freertos/port/esp8266/panic.c b/components/freertos/port/esp8266/panic.c index bab9cc9a..ddad1b88 100644 --- a/components/freertos/port/esp8266/panic.c +++ b/components/freertos/port/esp8266/panic.c @@ -38,9 +38,18 @@ void IRAM_ATTR panicHandler(void *frame) "A14", "A15", "SAR", "EXCCAUSE" }; + extern int _Pri_3_NMICount; + /* NMI can interrupt exception. */ ETS_INTR_LOCK(); + if (_Pri_3_NMICount == -1) { + void show_critical_info(void); + + ets_printf("\nWatch dog triggle:\n\n"); + show_critical_info(); + } + for (x = 0; x < 20; x += 4) { for (y = 0; y < 4; y++) { ets_printf("%8s: 0x%08x ", sdesc[x + y], regs[x + y + 1]); diff --git a/components/freertos/port/esp8266/port.c b/components/freertos/port/esp8266/port.c index 17304b29..42acc611 100644 --- a/components/freertos/port/esp8266/port.c +++ b/components/freertos/port/esp8266/port.c @@ -257,13 +257,11 @@ void IRAM_ATTR vPortExitCritical(void) } } -void ShowCritical(void) +void show_critical_info(void) { - printf("ShowCritical:%u\n", uxCriticalNesting); - printf("HdlMacSig:%u\n", HdlMacSig); - printf("SWReq:%u\n", SWReq); - - ets_delay_us(50000); + ets_printf("ShowCritical:%u\n", uxCriticalNesting); + ets_printf("HdlMacSig:%u\n", HdlMacSig); + ets_printf("SWReq:%u\n", SWReq); } void IRAM_ATTR vPortETSIntrLock(void) diff --git a/components/freertos/port/esp8266/xtensa_vectors.S b/components/freertos/port/esp8266/xtensa_vectors.S index 424f135a..dc93587a 100644 --- a/components/freertos/port/esp8266/xtensa_vectors.S +++ b/components/freertos/port/esp8266/xtensa_vectors.S @@ -1417,6 +1417,96 @@ nmi_rfi: #endif #endif /* NMI */ + .section .text, "ax" + .global ShowCritical + .type ShowCritical, @function + .align 4 +ShowCritical: + movi a2, LABEL(_Pri_,_NMICount) + l32i a2, a2, 0 + bnei a2, 1, nmi_reentry_panic + + /* + * a2 == 1, the function is not NMI exception function and its stack + * is stored at LABEL(_Pri_,_Stack) + PRI_N_STACK_SIZE + * + * a2 >= 1, the function is NMI exception function and its stack + * is stored at LABEL(_Pri_,_Stack) + PRI_N_STACK_SIZE + HESF_TOTALSIZE + PRI_N_STACK_SIZE2 + */ + movi a2, LABEL(_Pri_,_Stack) + PRI_N_STACK_SIZE + j nmi_common_panic +nmi_reentry_panic: + movi a2, LABEL(_Pri_,_Stack) + PRI_N_STACK_SIZE + HESF_TOTALSIZE + PRI_N_STACK_SIZE2 +nmi_common_panic: + movi a1, 0XFFFFFFFF + movi a3, LABEL(_Pri_,_NMICount) + s32i a1, a3, 0 + + movi a1, _chip_interrupt_tmp + addi a1, a1, -XT_STK_FRMSZ + + l32i a3, a2, HESF_AR(0) + s32i a3, a1, XT_STK_A0 + + l32i a3, a2, HESF_AR(1) + s32i a3, a1, XT_STK_A1 + + l32i a3, a2, HESF_AR(2) + s32i a3, a1, XT_STK_A2 + + l32i a3, a2, HESF_AR(3) + s32i a3, a1, XT_STK_A3 + + l32i a3, a2, HESF_AR(4) + s32i a3, a1, XT_STK_A4 + + l32i a3, a2, HESF_AR(5) + s32i a3, a1, XT_STK_A5 + + l32i a3, a2, HESF_AR(6) + s32i a3, a1, XT_STK_A6 + + l32i a3, a2, HESF_AR(7) + s32i a3, a1, XT_STK_A7 + + l32i a3, a2, HESF_AR(8) + s32i a3, a1, XT_STK_A8 + + l32i a3, a2, HESF_AR(9) + s32i a3, a1, XT_STK_A9 + + l32i a3, a2, HESF_AR(10) + s32i a3, a1, XT_STK_A10 + + l32i a3, a2, HESF_AR(11) + s32i a3, a1, XT_STK_A11 + + l32i a3, a2, HESF_AR(12) + s32i a3, a1, XT_STK_A12 + + l32i a3, a2, HESF_AR(13) + s32i a3, a1, XT_STK_A13 + + l32i a3, a2, HESF_AR(14) + s32i a3, a1, XT_STK_A14 + + l32i a3, a2, HESF_AR(15) + s32i a3, a1, XT_STK_A15 + + l32i a3, a2, HESF_EXCCAUSE + s32i a3, a1, XT_STK_EXCCAUSE + + l32i a3, a2, HESF_EPC3 + s32i a3, a1, XT_STK_PC + + l32i a3, a2, HESF_EPS3 + s32i a3, a1, XT_STK_PS + + mov a2, a1 + + call0 panicHandler + + .global _xt_ext_panic .type _xt_ext_panic, @function .align 4