From c4c62b2a8ab824db69eddf18e2269e29f31fe5ab Mon Sep 17 00:00:00 2001 From: Espressif Systems <wujiangang@espressif.com> 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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 F`Y&LNh7te( delta 5114 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 UuTSoK&;F(}sej5=F5jH_AHvw40{{R3 diff --git a/lib/libmain.a b/lib/libmain.a index 9fd42ec21eafcef34c351b3f3aab74cb22a63b4c..6b5988bd6584d04826d74fd4c60d786a19f1ed02 100644 GIT binary patch delta 22736 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 S`)(}#@?JA@Swqlv&c6d$_`G-k delta 22901 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 RFsJyW&^<L~W6<vF{{^jYG@bwe diff --git a/lib/libpp.a b/lib/libpp.a index 441a7be42d5794c5e5ef7a86926724ccf52006f4..dfe26118db308de788265e5aef134d8fd94bbbd5 100644 GIT binary patch delta 14832 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 delta 14475 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 K{0F*<yZ##sKN7nD diff --git a/third_party/freertos/port.c b/third_party/freertos/port.c index 415c9d07..ab8472ed 100644 --- a/third_party/freertos/port.c +++ b/third_party/freertos/port.c @@ -80,7 +80,6 @@ extern char NMIIrqIsOn; static char HdlMacSig = 0; static char SWReq = 0; -static char PendSvIsPosted = 0; unsigned cpu_sr; @@ -88,277 +87,191 @@ unsigned cpu_sr; variable. */ static unsigned portBASE_TYPE uxCriticalNesting = 0; -void vPortEnterCritical( void ); -void vPortExitCritical( void ); +void vPortEnterCritical(void); +void vPortExitCritical(void); /* * See header file for description. */ -portSTACK_TYPE * ICACHE_FLASH_ATTR -pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +portSTACK_TYPE* ICACHE_FLASH_ATTR +pxPortInitialiseStack(portSTACK_TYPE* pxTopOfStack, pdTASK_CODE pxCode, void* pvParameters) { - #define SET_STKREG(r,v) sp[(r) >> 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<<ETS_SOFT_INUM); - } -#endif - if(tmp == 1) - vPortExitCritical(); + if (req == 1) { + vPortEnterCritical(); + SWReq = 1; + xthal_set_intset(1 << ETS_SOFT_INUM); + vPortExitCritical(); + } else if (req == 2) { + HdlMacSig = 1; + xthal_set_intset(1 << ETS_SOFT_INUM); + } } extern portBASE_TYPE MacIsrSigPostDefHdl(void); -#if 0 -void IRAM_FUNC_ATTR -GPIOIntrHdl(void) + +void SoftIsrHdl(void* arg) { -//if( (GPIO_REG_READ(GPIO_STATUS_ADDRESS) & (1<<6)) == 0 ) - //printf("i"); - //printf("g,%08x\n",GPIO_REG_READ(GPIO_STATUS_ADDRESS)); -//SDIO_CLK GPIO interrupt + ETS_NMI_LOCK(); - if( (GPIO_REG_READ(GPIO_STATUS_ADDRESS) & (1<<6)) != 0 ) - { - //CloseNMI(); + portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; - portBASE_TYPE xHigherPriorityTaskWoken=pdFALSE ; - if(HdlMacSig == 1) - { - HdlMacSig = 0; - xHigherPriorityTaskWoken = MacIsrSigPostDefHdl(); - } - if( xHigherPriorityTaskWoken || (SWReq==1)) - { - SWReq = 0; - _xt_timer_int1(); - } - //OpenNMI(); - GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, 0x40); - } + if (HdlMacSig == 1) { + HdlMacSig = 0; + xHigherPriorityTaskWoken = MacIsrSigPostDefHdl(); + } + + if (xHigherPriorityTaskWoken || (SWReq == 1)) { + _xt_timer_int1(); + SWReq = 0; + } + + ETS_NMI_UNLOCK(); } -#else -void SoftIsrHdl(void *arg) -{ -//if(DbgVal5==1) - //printf("GP_%d,",SWReq); - PendSvIsPosted = 0; - portBASE_TYPE xHigherPriorityTaskWoken=pdFALSE ; - if(HdlMacSig == 1) - { - xHigherPriorityTaskWoken = MacIsrSigPostDefHdl(); - HdlMacSig = 0; - } - if( xHigherPriorityTaskWoken || (SWReq==1)) - { -//if( DbgVal5==1 || DbgVal10==1 ) - //printf("_x_s,"); - _xt_timer_int1(); - SWReq = 0; - } -} -#endif -void xPortSysTickHandle (void) +void xPortSysTickHandle(void) { - //CloseNMI(); - { - if(xTaskIncrementTick() !=pdFALSE ) - { - //GPIO_REG_WRITE(GPIO_STATUS_W1TS_ADDRESS, 0x40); - vTaskSwitchContext(); - } - } - //OpenNMI(); + if (xTaskIncrementTick() != pdFALSE) { + vTaskSwitchContext(); + } } /* * See header file for description. */ portBASE_TYPE ICACHE_FLASH_ATTR -xPortStartScheduler( void ) +xPortStartScheduler(void) { - //set pendsv and systemtick as lowest priority ISR. - //pendsv setting - /*******GPIO sdio_clk isr*********/ -#if 0 - _xt_isr_attach(ETS_GPIO_INUM, GPIOIntrHdl, NULL); - _xt_isr_unmask(1<<ETS_GPIO_INUM); -#else - /*******software isr*********/ - _xt_isr_attach(ETS_SOFT_INUM, SoftIsrHdl, NULL); - _xt_isr_unmask(1<<ETS_SOFT_INUM); -#endif + /*******software isr*********/ + _xt_isr_attach(ETS_SOFT_INUM, SoftIsrHdl, NULL); + _xt_isr_unmask(1 << ETS_SOFT_INUM); /* Initialize system tick timer interrupt and schedule the first tick. */ _xt_tick_timer_init(); -// os_printf("xPortStartScheduler\n"); vTaskSwitchContext(); -// REG_SET_BIT(0x3ff2006c, BIT(4)); - /* Restore the context of the first task that is going to run. */ + /* Restore the context of the first task that is going to run. */ + XT_RTOS_INT_EXIT(); - XT_RTOS_INT_EXIT(); - - /* Should not get here as the tasks are now running! */ - return pdTRUE; + /* Should not get here as the tasks are now running! */ + return pdTRUE; } void ICACHE_FLASH_ATTR -vPortEndScheduler( void ) +vPortEndScheduler(void) { - /* It is unlikely that the CM3 port will require this function as there - is nothing to return to. */ + /* It is unlikely that the CM3 port will require this function as there + is nothing to return to. */ } /*-----------------------------------------------------------*/ - /*-----------------------------------------------------------*/ -static unsigned int tick_lock=0; static char ClosedLv1Isr = 0; -void vPortEnterCritical( void ) +void vPortEnterCritical(void) { - if(NMIIrqIsOn == 0) - { - //if( uxCriticalNesting == 0 ) - { - if( ClosedLv1Isr !=1 ) - { - portDISABLE_INTERRUPTS(); - ClosedLv1Isr = 1; - } - //tick_lock = WDEV_NOW(); - } - uxCriticalNesting++; - } + if (NMIIrqIsOn == 0) { + if (ClosedLv1Isr != 1) { + portDISABLE_INTERRUPTS(); + ClosedLv1Isr = 1; + } + uxCriticalNesting++; + } } /*-----------------------------------------------------------*/ -void vPortExitCritical( void ) +void vPortExitCritical(void) { - 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)); - } - } + 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<<index); + _xt_clear_ints(1 << index); _xt_isr_status = 1; isr[index].handler(isr[index].arg);