From f80824a2d8c529ad11c95546421830c208cca0b9 Mon Sep 17 00:00:00 2001 From: houchenyao Date: Wed, 20 Sep 2017 17:17:51 +0800 Subject: [PATCH] test: support test for UT cases expect to reset --- components/esp32/panic.c | 79 ++++++++++++------- components/esp32/test/test_exception.c | 9 +++ components/esp32/test/test_restart.c | 10 +-- components/esp32/test/test_sleep.c | 14 ++-- .../TestCaseScript/IDFUnitTest/UnitTest.py | 43 ++++++---- tools/unit-test-app/tools/TagDefinition.yml | 3 + tools/unit-test-app/tools/UnitTestParser.py | 2 + 7 files changed, 102 insertions(+), 58 deletions(-) create mode 100644 components/esp32/test/test_exception.c diff --git a/components/esp32/panic.c b/components/esp32/panic.c index 906e1ee365..d09257268f 100644 --- a/components/esp32/panic.c +++ b/components/esp32/panic.c @@ -129,14 +129,14 @@ static __attribute__((noreturn)) inline void invoke_abort() SEGGER_RTT_ESP32_FlushNoLock(CONFIG_ESP32_APPTRACE_POSTMORTEM_FLUSH_TRAX_THRESH, APPTRACE_ONPANIC_HOST_FLUSH_TMO); #else esp_apptrace_flush_nolock(ESP_APPTRACE_DEST_TRAX, CONFIG_ESP32_APPTRACE_POSTMORTEM_FLUSH_TRAX_THRESH, - APPTRACE_ONPANIC_HOST_FLUSH_TMO); + APPTRACE_ONPANIC_HOST_FLUSH_TMO); #endif #endif - while(1) { + while (1) { if (esp_cpu_in_ocd_debug_mode()) { __asm__ ("break 0,0"); } - *((int*) 0) = 0; + *((int *) 0) = 0; } } @@ -221,13 +221,17 @@ void panicHandler(XtExcFrame *frame) int debugRsn; asm("rsr.debugcause %0":"=r"(debugRsn)); panicPutStr("Debug exception reason: "); - if (debugRsn&XCHAL_DEBUGCAUSE_ICOUNT_MASK) panicPutStr("SingleStep "); - if (debugRsn&XCHAL_DEBUGCAUSE_IBREAK_MASK) panicPutStr("HwBreakpoint "); - if (debugRsn&XCHAL_DEBUGCAUSE_DBREAK_MASK) { + if (debugRsn & XCHAL_DEBUGCAUSE_ICOUNT_MASK) { + panicPutStr("SingleStep "); + } + if (debugRsn & XCHAL_DEBUGCAUSE_IBREAK_MASK) { + panicPutStr("HwBreakpoint "); + } + if (debugRsn & XCHAL_DEBUGCAUSE_DBREAK_MASK) { //Unlike what the ISA manual says, this core seemingly distinguishes from a DBREAK //reason caused by watchdog 0 and one caused by watchdog 1 by setting bit 8 of the //debugcause if the cause is watchdog 1 and clearing it if it's watchdog 0. - if (debugRsn&(1<<8)) { + if (debugRsn & (1 << 8)) { #if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK const char *name = pcTaskGetTaskName(xTaskGetCurrentTaskHandleForCPU(core_id)); panicPutStr("Stack canary watchpoint triggered ("); @@ -239,10 +243,16 @@ void panicHandler(XtExcFrame *frame) } else { panicPutStr("Watchpoint 0 triggered "); } - } - if (debugRsn&XCHAL_DEBUGCAUSE_BREAK_MASK) panicPutStr("BREAK instr "); - if (debugRsn&XCHAL_DEBUGCAUSE_BREAKN_MASK) panicPutStr("BREAKN instr "); - if (debugRsn&XCHAL_DEBUGCAUSE_DEBUGINT_MASK) panicPutStr("DebugIntr "); + } + if (debugRsn & XCHAL_DEBUGCAUSE_BREAK_MASK) { + panicPutStr("BREAK instr "); + } + if (debugRsn & XCHAL_DEBUGCAUSE_BREAKN_MASK) { + panicPutStr("BREAKN instr "); + } + if (debugRsn & XCHAL_DEBUGCAUSE_DEBUGINT_MASK) { + panicPutStr("DebugIntr "); + } panicPutStr("\r\n"); } @@ -252,7 +262,7 @@ void panicHandler(XtExcFrame *frame) SEGGER_RTT_ESP32_FlushNoLock(CONFIG_ESP32_APPTRACE_POSTMORTEM_FLUSH_TRAX_THRESH, APPTRACE_ONPANIC_HOST_FLUSH_TMO); #else esp_apptrace_flush_nolock(ESP_APPTRACE_DEST_TRAX, CONFIG_ESP32_APPTRACE_POSTMORTEM_FLUSH_TRAX_THRESH, - APPTRACE_ONPANIC_HOST_FLUSH_TMO); + APPTRACE_ONPANIC_HOST_FLUSH_TMO); #endif #endif setFirstBreakpoint(frame->pc); @@ -266,15 +276,16 @@ void xt_unhandled_exception(XtExcFrame *frame) haltOtherCore(); esp_dport_access_int_abort(); if (!abort_called) { - panicPutStr("Guru Meditation Error of type "); + panicPutStr("Guru Meditation Error: Core "); + panicPutDec(xPortGetCoreID()); + panicPutStr(" panic'ed ("); int exccause = frame->exccause; if (exccause < NUM_EDESCS) { panicPutStr(edesc[exccause]); } else { panicPutStr("Unknown"); } - panicPutStr(" occurred on core "); - panicPutDec(xPortGetCoreID()); + panicPutStr(")\r\n"); if (esp_cpu_in_ocd_debug_mode()) { panicPutStr(" at pc="); panicPutHex(frame->pc); @@ -284,7 +295,7 @@ void xt_unhandled_exception(XtExcFrame *frame) SEGGER_RTT_ESP32_FlushNoLock(CONFIG_ESP32_APPTRACE_POSTMORTEM_FLUSH_TRAX_THRESH, APPTRACE_ONPANIC_HOST_FLUSH_TMO); #else esp_apptrace_flush_nolock(ESP_APPTRACE_DEST_TRAX, CONFIG_ESP32_APPTRACE_POSTMORTEM_FLUSH_TRAX_THRESH, - APPTRACE_ONPANIC_HOST_FLUSH_TMO); + APPTRACE_ONPANIC_HOST_FLUSH_TMO); #endif #endif //Stick a hardware breakpoint on the address the handler returns to. This way, the OCD debugger @@ -458,7 +469,7 @@ static __attribute__((noreturn)) void commonErrorHandler(XtExcFrame *frame) SEGGER_RTT_ESP32_FlushNoLock(CONFIG_ESP32_APPTRACE_POSTMORTEM_FLUSH_TRAX_THRESH, APPTRACE_ONPANIC_HOST_FLUSH_TMO); #else esp_apptrace_flush_nolock(ESP_APPTRACE_DEST_TRAX, CONFIG_ESP32_APPTRACE_POSTMORTEM_FLUSH_TRAX_THRESH, - APPTRACE_ONPANIC_HOST_FLUSH_TMO); + APPTRACE_ONPANIC_HOST_FLUSH_TMO); #endif reconfigureAllWdts(); #endif @@ -515,28 +526,36 @@ void esp_set_breakpoint_if_jtag(void *fn) esp_err_t esp_set_watchpoint(int no, void *adr, int size, int flags) { int x; - if (no<0 || no>1) return ESP_ERR_INVALID_ARG; - if (flags&(~0xC0000000)) return ESP_ERR_INVALID_ARG; - int dbreakc=0x3F; + if (no < 0 || no > 1) { + return ESP_ERR_INVALID_ARG; + } + if (flags & (~0xC0000000)) { + return ESP_ERR_INVALID_ARG; + } + int dbreakc = 0x3F; //We support watching 2^n byte values, from 1 to 64. Calculate the mask for that. - for (x=0; x<7; x++) { - if (size==(1<