From c4c62b2a8ab824db69eddf18e2269e29f31fe5ab Mon Sep 17 00:00:00 2001 From: Espressif Systems Date: Mon, 12 Mar 2018 16:36:18 +0800 Subject: [PATCH] fix(system): Fix wdt crash issue 1. only lock nmi in soft isr; 2. simplify PendSV; 3. more log info when wdt happen; 4. Fix nmi reentried issue; 5. Add some protection code; internal: 5c208f68 --- VERSION | 6 +- lib/libfreertos.a | Bin 83578 -> 83374 bytes lib/libmain.a | Bin 200818 -> 201032 bytes lib/libpp.a | Bin 238642 -> 238998 bytes third_party/freertos/port.c | 333 +++++++++++++----------------------- 5 files changed, 125 insertions(+), 214 deletions(-) diff --git a/VERSION b/VERSION index 8214120a..37395a61 100644 --- a/VERSION +++ b/VERSION @@ -1,10 +1,10 @@ gwen: crypto: 9ec59b5 espnow: 9ec59b5 - main: cc0968d + main: e9e3ace minic: 9ec59b5 net80211: f2108f6 - pp: 1cf9bb0 + pp: e9e3ace pwm: 9ec59b5 smartconfig:9ec59b5 wpa: f2108f6 @@ -12,7 +12,7 @@ gwen: gitlab: espconn: 3a998034 - freertos: 66a199b7 + freertos: a9985a9c lwip: 4dd2bcd3 driver: 7bee5263 mbedtls: 1ac9f1f4 diff --git a/lib/libfreertos.a b/lib/libfreertos.a index fe1d8bdd40f0162837f2f46e1433a0542a5f2cce..837c9c6bbb5c49135155b42ea43da5cb894f8601 100644 GIT binary patch delta 5063 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 S`)(}#@?JA@Swqlv&c6d$_`G-k delta 22901 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 2] = (portSTACK_TYPE)(v) - portSTACK_TYPE *sp, *tp; +#define SET_STKREG(r,v) sp[(r) >> 2] = (portSTACK_TYPE)(v) + portSTACK_TYPE* sp, *tp; /* Create interrupt stack frame aligned to 16 byte boundary */ - sp = (portSTACK_TYPE*) (((INT32U)(pxTopOfStack+1) - XT_CP_SIZE - XT_STK_FRMSZ) & ~0xf); + sp = (portSTACK_TYPE*)(((INT32U)(pxTopOfStack + 1) - XT_CP_SIZE - XT_STK_FRMSZ) & ~0xf); /* Clear the entire frame (do not use memset() because we don't depend on C library) */ - for (tp = sp; tp <= pxTopOfStack; ++tp) + for (tp = sp; tp <= pxTopOfStack; ++tp) { *tp = 0; + } /* Explicitly initialize certain saved registers */ - SET_STKREG( XT_STK_PC, pxCode ); /* task entrypoint */ - SET_STKREG( XT_STK_A0, 0 ); /* to terminate GDB backtrace */ - SET_STKREG( XT_STK_A1, (INT32U)sp + XT_STK_FRMSZ ); /* physical top of stack frame */ - SET_STKREG( XT_STK_A2, pvParameters ); /* parameters */ - SET_STKREG( XT_STK_EXIT, _xt_user_exit ); /* user exception exit dispatcher */ + SET_STKREG(XT_STK_PC, pxCode); /* task entrypoint */ + SET_STKREG(XT_STK_A0, 0); /* to terminate GDB backtrace */ + SET_STKREG(XT_STK_A1, (INT32U)sp + XT_STK_FRMSZ); /* physical top of stack frame */ + SET_STKREG(XT_STK_A2, pvParameters); /* parameters */ + SET_STKREG(XT_STK_EXIT, _xt_user_exit); /* user exception exit dispatcher */ /* Set initial PS to int level 0, EXCM disabled ('rfe' will enable), user mode. */ - #ifdef __XTENSA_CALL0_ABI__ - SET_STKREG( XT_STK_PS, PS_UM | PS_EXCM ); - #else +#ifdef __XTENSA_CALL0_ABI__ + SET_STKREG(XT_STK_PS, PS_UM | PS_EXCM); +#else /* + for windowed ABI also set WOE and CALLINC (pretend task was 'call4'd). */ - SET_STKREG( XT_STK_PS, PS_UM | PS_EXCM | PS_WOE | PS_CALLINC(1) ); - #endif + SET_STKREG(XT_STK_PS, PS_UM | PS_EXCM | PS_WOE | PS_CALLINC(1)); +#endif - return sp; + return sp; } - -void PendSV( char req ) +void PendSV(char req) { - char tmp=0; -//ETS_INTR_LOCK(); - - if( NMIIrqIsOn == 0 ) - { - vPortEnterCritical(); - //PortDisableInt_NoNest(); - tmp = 1; - } - - if(req ==1) - { - SWReq = 1; - } - else if(req ==2) - HdlMacSig= 1; -#if 0 - GPIO_REG_WRITE(GPIO_STATUS_W1TS_ADDRESS, 0x40); -#else - if(PendSvIsPosted == 0) - { - PendSvIsPosted = 1; - xthal_set_intset(1< 0) - { - uxCriticalNesting--; - if( uxCriticalNesting == 0 ) - { - if( ClosedLv1Isr ==1 ) - { - ClosedLv1Isr = 0; - portENABLE_INTERRUPTS(); - } - } - } - else - { - ets_printf("E:C:%d\n",uxCriticalNesting); - PORT_ASSERT((uxCriticalNesting>0)); - } - } + if (NMIIrqIsOn == 0) { + if (uxCriticalNesting > 0) { + uxCriticalNesting--; + + if (uxCriticalNesting == 0) { + if (ClosedLv1Isr == 1) { + ClosedLv1Isr = 0; + portENABLE_INTERRUPTS(); + } + } + } else { + ets_printf("E:C:%d\n", uxCriticalNesting); + PORT_ASSERT((uxCriticalNesting > 0)); + } + } } -void ShowCritical(void) +void ICACHE_FLASH_ATTR ShowCritical(void) { - ets_printf("ShowCritical:%d\n",uxCriticalNesting); + os_printf("ShowCritical:%d\n", uxCriticalNesting); + os_printf("HdlMacSig:%d\n", HdlMacSig); + os_printf("SWReq:%d\n", SWReq); + ets_delay_us(50000); } - -void vPortETSIntrLock( void ) +void vPortETSIntrLock(void) { - ETS_INTR_LOCK(); + ETS_INTR_LOCK(); } -void vPortETSIntrUnlock( void ) +void vPortETSIntrUnlock(void) { - ETS_INTR_UNLOCK(); + ETS_INTR_UNLOCK(); } -void -PortDisableInt_NoNest( void ) +void PortDisableInt_NoNest(void) { -// printf("ERRRRRRR\n"); - if(NMIIrqIsOn == 0) - { - if( ClosedLv1Isr !=1 ) - { - portDISABLE_INTERRUPTS(); - ClosedLv1Isr = 1; - } - } + if (NMIIrqIsOn == 0) { + if (ClosedLv1Isr != 1) { + portDISABLE_INTERRUPTS(); + ClosedLv1Isr = 1; + } + } } -void -PortEnableInt_NoNest( void ) +void PortEnableInt_NoNest(void) { -// printf("ERRRRR\n"); - - if(NMIIrqIsOn == 0) - { - if( ClosedLv1Isr ==1 ) - { - ClosedLv1Isr = 0; - portENABLE_INTERRUPTS(); - } - } + if (NMIIrqIsOn == 0) { + if (ClosedLv1Isr == 1) { + ClosedLv1Isr = 0; + portENABLE_INTERRUPTS(); + } + } } /*-----------------------------------------------------------*/ -void ICACHE_FLASH_ATTR ResetCcountVal( unsigned int cnt_val ) +void ICACHE_FLASH_ATTR ResetCcountVal(unsigned int cnt_val) { -// XT_WSR_CCOUNT(cnt_val); asm volatile("wsr a2, ccount"); } @@ -366,7 +279,7 @@ _xt_isr_entry isr[16]; char _xt_isr_status = 0; void ICACHE_FLASH_ATTR -_xt_isr_attach(uint8 i, _xt_isr func, void *arg) +_xt_isr_attach(uint8 i, _xt_isr func, void* arg) { isr[i].handler = func; isr[i].arg = arg; @@ -374,24 +287,22 @@ _xt_isr_attach(uint8 i, _xt_isr func, void *arg) uint16 _xt_isr_handler(uint16 i) { - uint8 index; + uint8 index; - if (i & (1 << ETS_WDT_INUM)) { -// printf("i %x %u\n", i, REG_READ(0x3ff20c00)); - index = ETS_WDT_INUM; - } - else if (i & (1 << ETS_GPIO_INUM)) { - index = ETS_GPIO_INUM; - }else { - index = __builtin_ffs(i) - 1; + if (i & (1 << ETS_WDT_INUM)) { + index = ETS_WDT_INUM; + } else if (i & (1 << ETS_GPIO_INUM)) { + index = ETS_GPIO_INUM; + } else { + index = __builtin_ffs(i) - 1; - if (index == ETS_MAX_INUM) { - i &= ~(1 << ETS_MAX_INUM); - index = __builtin_ffs(i) - 1; - } - } + if (index == ETS_MAX_INUM) { + i &= ~(1 << ETS_MAX_INUM); + index = __builtin_ffs(i) - 1; + } + } - _xt_clear_ints(1<