From 5861290e435d870ec6d165c12691e5200c383941 Mon Sep 17 00:00:00 2001 From: daishengdong Date: Wed, 3 Jun 2020 20:37:10 +0800 Subject: [PATCH] fix hardfault backtrace support for iccarm --- arch/arm/arm-v6m/cortex-m0/iccarm/port_c.c | 37 ++++---------- arch/arm/arm-v7m/cortex-m0+/iccarm/port_c.c | 37 ++++---------- arch/arm/arm-v7m/cortex-m4/iccarm/port_c.c | 24 +-------- arch/arm/arm-v7m/cortex-m7/iccarm/port_c.c | 24 +-------- arch/arm/arm-v8m/cortex-m23/iccarm/port_c.c | 25 ++-------- .../BSP/Src/stm32f7xx_it.c | 2 +- .../hello_world/ALIENTEK_Aploo_STM32F767.ewp | 3 ++ .../TOS-CONFIG/tos_config.h | 2 + .../NUCLEO_STM32L073RZ/BSP/Src/stm32l0xx_it.c | 2 +- .../IAR/hello_world/TencentOS_tiny.ewp | 50 +++++++++++++++---- .../IAR/hello_world/TencentOS_tiny.ewt | 3 ++ .../TOS_CONFIG/tos_config.h | 2 + 12 files changed, 80 insertions(+), 131 deletions(-) diff --git a/arch/arm/arm-v6m/cortex-m0/iccarm/port_c.c b/arch/arm/arm-v6m/cortex-m0/iccarm/port_c.c index 8316e60e..106bb319 100644 --- a/arch/arm/arm-v6m/cortex-m0/iccarm/port_c.c +++ b/arch/arm/arm-v6m/cortex-m0/iccarm/port_c.c @@ -76,43 +76,28 @@ __PORT__ void port_standby_mode_enter(void) #endif #if TOS_CFG_FAULT_BACKTRACE_EN > 0u + __PORT__ void port_fault_diagnosis(void) { k_fault_log_writer("fault diagnosis is not supported in CORTEX M0\n"); } -/*------------------ RealView Compiler -----------------*/ -/* V5 */ -#if defined(__CC_ARM) - -__PORT__ __ASM__ void HardFault_Handler(void) -{ - IMPORT fault_backtrace - - MOV r0, lr - TST lr, #0x04 - ITE EQ - MRSEQ r1, MSP - MRSNE r1, PSP - BL fault_backtrace -} - -/*------------------ ARM Compiler V6 -------------------*/ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - __PORT__ void __NAKED__ HardFault_Handler(void) { __ASM__ __VOLATILE__ ( "MOV r0, lr\n\t" - "TST lr, #0x04\n\t" - "ITE EQ\n\t" - "MRSEQ r1, MSP\n\t" - "MRSNE r1, PSP\n\t" - "BL fault_backtrace\n\t" + "MOVS r1, #0x04\n\t" + "TST r0, r1\n\t" + "BEQ _LD_MSP\n\t" + "MRS r1, PSP\n\t" + "B _EXIT\n" + "_LD_MSP:\n\t" + "MRS r1, MSP\n" + "_EXIT:\n\t" + "LDR r2, =fault_backtrace\n\t" + "BX r2\n\t" ); } -#endif /* ARMCC VERSION */ - #endif /* TOS_CFG_FAULT_BACKTRACE_EN */ diff --git a/arch/arm/arm-v7m/cortex-m0+/iccarm/port_c.c b/arch/arm/arm-v7m/cortex-m0+/iccarm/port_c.c index 40f810f2..e2041903 100644 --- a/arch/arm/arm-v7m/cortex-m0+/iccarm/port_c.c +++ b/arch/arm/arm-v7m/cortex-m0+/iccarm/port_c.c @@ -93,43 +93,28 @@ __PORT__ void port_standby_mode_enter(void) #endif #if TOS_CFG_FAULT_BACKTRACE_EN > 0u + __PORT__ void port_fault_diagnosis(void) { k_fault_log_writer("fault diagnosis is not supported in CORTEX M0+\n"); } -/*------------------ RealView Compiler -----------------*/ -/* V5 */ -#if defined(__CC_ARM) - -__PORT__ __ASM__ void HardFault_Handler(void) -{ - IMPORT fault_backtrace - - MOV r0, lr - TST lr, #0x04 - ITE EQ - MRSEQ r1, MSP - MRSNE r1, PSP - BL fault_backtrace -} - -/*------------------ ARM Compiler V6 -------------------*/ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - __PORT__ void __NAKED__ HardFault_Handler(void) { __ASM__ __VOLATILE__ ( "MOV r0, lr\n\t" - "TST lr, #0x04\n\t" - "ITE EQ\n\t" - "MRSEQ r1, MSP\n\t" - "MRSNE r1, PSP\n\t" - "BL fault_backtrace\n\t" + "MOVS r1, #0x04\n\t" + "TST r0, r1\n\t" + "BEQ _LD_MSP\n\t" + "MRS r1, PSP\n\t" + "B _EXIT\n" + "_LD_MSP:\n\t" + "MRS r1, MSP\n" + "_EXIT:\n\t" + "LDR r2, =fault_backtrace\n\t" + "BX r2\n\t" ); } -#endif /* ARMCC VERSION */ - #endif /* TOS_CFG_FAULT_BACKTRACE_EN */ diff --git a/arch/arm/arm-v7m/cortex-m4/iccarm/port_c.c b/arch/arm/arm-v7m/cortex-m4/iccarm/port_c.c index 43497d09..f82dfe28 100644 --- a/arch/arm/arm-v7m/cortex-m4/iccarm/port_c.c +++ b/arch/arm/arm-v7m/cortex-m4/iccarm/port_c.c @@ -244,25 +244,6 @@ __PORT__ void port_fault_diagnosis(void) port_fault_do_diagnosis(®s); } -/*------------------ RealView Compiler -----------------*/ -/* V5 */ -#if defined(__CC_ARM) - -__PORT__ __ASM__ void HardFault_Handler(void) -{ - IMPORT fault_backtrace - - MOV r0, lr - TST lr, #0x04 - ITE EQ - MRSEQ r1, MSP - MRSNE r1, PSP - BL fault_backtrace -} - -/*------------------ ARM Compiler V6 -------------------*/ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - __PORT__ void __NAKED__ HardFault_Handler(void) { __ASM__ __VOLATILE__ ( @@ -271,11 +252,10 @@ __PORT__ void __NAKED__ HardFault_Handler(void) "ITE EQ\n\t" "MRSEQ r1, MSP\n\t" "MRSNE r1, PSP\n\t" - "BL fault_backtrace\n\t" + "LDR r2, =fault_backtrace\n\t" + "BX r2\n\t" ); } -#endif /* ARMCC VERSION */ - #endif /* TOS_CFG_FAULT_BACKTRACE_EN */ diff --git a/arch/arm/arm-v7m/cortex-m7/iccarm/port_c.c b/arch/arm/arm-v7m/cortex-m7/iccarm/port_c.c index 830be415..62815480 100644 --- a/arch/arm/arm-v7m/cortex-m7/iccarm/port_c.c +++ b/arch/arm/arm-v7m/cortex-m7/iccarm/port_c.c @@ -227,25 +227,6 @@ __PORT__ void port_fault_diagnosis(void) port_fault_do_diagnosis(®s); } -/*------------------ RealView Compiler -----------------*/ -/* V5 */ -#if defined(__CC_ARM) - -__PORT__ __ASM__ void HardFault_Handler(void) -{ - IMPORT fault_backtrace - - MOV r0, lr - TST lr, #0x04 - ITE EQ - MRSEQ r1, MSP - MRSNE r1, PSP - BL fault_backtrace -} - -/*------------------ ARM Compiler V6 -------------------*/ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - __PORT__ void __NAKED__ HardFault_Handler(void) { __ASM__ __VOLATILE__ ( @@ -254,11 +235,10 @@ __PORT__ void __NAKED__ HardFault_Handler(void) "ITE EQ\n\t" "MRSEQ r1, MSP\n\t" "MRSNE r1, PSP\n\t" - "BL fault_backtrace\n\t" + "LDR r2, =fault_backtrace\n\t" + "BX r2\n\t" ); } -#endif /* ARMCC VERSION */ - #endif /* TOS_CFG_FAULT_BACKTRACE_EN */ diff --git a/arch/arm/arm-v8m/cortex-m23/iccarm/port_c.c b/arch/arm/arm-v8m/cortex-m23/iccarm/port_c.c index 02a1d724..6276a38a 100644 --- a/arch/arm/arm-v8m/cortex-m23/iccarm/port_c.c +++ b/arch/arm/arm-v8m/cortex-m23/iccarm/port_c.c @@ -93,30 +93,12 @@ __PORT__ void port_standby_mode_enter(void) #endif #if TOS_CFG_FAULT_BACKTRACE_EN > 0u + __PORT__ void port_fault_diagnosis(void) { k_fault_log_writer("fault diagnosis is not supported in CORTEX M23\n"); } -/*------------------ RealView Compiler -----------------*/ -/* V5 */ -#if defined(__CC_ARM) - -__PORT__ __ASM__ void HardFault_Handler(void) -{ - IMPORT fault_backtrace - - MOV r0, lr - TST lr, #0x04 - ITE EQ - MRSEQ r1, MSP - MRSNE r1, PSP - BL fault_backtrace -} - -/*------------------ ARM Compiler V6 -------------------*/ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - __PORT__ void __NAKED__ HardFault_Handler(void) { __ASM__ __VOLATILE__ ( @@ -125,11 +107,10 @@ __PORT__ void __NAKED__ HardFault_Handler(void) "ITE EQ\n\t" "MRSEQ r1, MSP\n\t" "MRSNE r1, PSP\n\t" - "BL fault_backtrace\n\t" + "LDR r2, =fault_backtrace\n\t" + "BX r2\n\t" ); } -#endif /* ARMCC VERSION */ - #endif /* TOS_CFG_FAULT_BACKTRACE_EN */ diff --git a/board/ALIENTEK_Apollo_STM32F767/BSP/Src/stm32f7xx_it.c b/board/ALIENTEK_Apollo_STM32F767/BSP/Src/stm32f7xx_it.c index aa1e0341..26c03169 100644 --- a/board/ALIENTEK_Apollo_STM32F767/BSP/Src/stm32f7xx_it.c +++ b/board/ALIENTEK_Apollo_STM32F767/BSP/Src/stm32f7xx_it.c @@ -61,7 +61,7 @@ void NMI_Handler(void) /** * @brief This function handles Hard fault interrupt. */ -void HardFault_Handler(void) +void xHardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ diff --git a/board/ALIENTEK_Apollo_STM32F767/IAR/hello_world/ALIENTEK_Aploo_STM32F767.ewp b/board/ALIENTEK_Apollo_STM32F767/IAR/hello_world/ALIENTEK_Aploo_STM32F767.ewp index e472463a..de868a86 100644 --- a/board/ALIENTEK_Apollo_STM32F767/IAR/hello_world/ALIENTEK_Aploo_STM32F767.ewp +++ b/board/ALIENTEK_Apollo_STM32F767/IAR/hello_world/ALIENTEK_Aploo_STM32F767.ewp @@ -1169,6 +1169,9 @@ $PROJ_DIR$\..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c + + $PROJ_DIR$\..\..\..\..\arch\arm\arm-v7m\common\tos_fault.c + kernel diff --git a/board/ALIENTEK_Apollo_STM32F767/TOS-CONFIG/tos_config.h b/board/ALIENTEK_Apollo_STM32F767/TOS-CONFIG/tos_config.h index d2abb9dd..23081687 100644 --- a/board/ALIENTEK_Apollo_STM32F767/TOS-CONFIG/tos_config.h +++ b/board/ALIENTEK_Apollo_STM32F767/TOS-CONFIG/tos_config.h @@ -37,5 +37,7 @@ #define TOS_CFG_TIMER_AS_PROC 1u +#define TOS_CFG_FAULT_BACKTRACE_EN 1u + #endif diff --git a/board/NUCLEO_STM32L073RZ/BSP/Src/stm32l0xx_it.c b/board/NUCLEO_STM32L073RZ/BSP/Src/stm32l0xx_it.c index 90b89401..0f6084c9 100644 --- a/board/NUCLEO_STM32L073RZ/BSP/Src/stm32l0xx_it.c +++ b/board/NUCLEO_STM32L073RZ/BSP/Src/stm32l0xx_it.c @@ -82,7 +82,7 @@ void NMI_Handler(void) /** * @brief This function handles Hard fault interrupt. */ -void HardFault_Handler(void) +void HardFault_Handlerx(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ diff --git a/board/NUCLEO_STM32L073RZ/IAR/hello_world/TencentOS_tiny.ewp b/board/NUCLEO_STM32L073RZ/IAR/hello_world/TencentOS_tiny.ewp index b77c05a0..c580d4f5 100644 --- a/board/NUCLEO_STM32L073RZ/IAR/hello_world/TencentOS_tiny.ewp +++ b/board/NUCLEO_STM32L073RZ/IAR/hello_world/TencentOS_tiny.ewp @@ -66,7 +66,7 @@ tos/cmsis-os diff --git a/board/NUCLEO_STM32L073RZ/IAR/hello_world/TencentOS_tiny.ewt b/board/NUCLEO_STM32L073RZ/IAR/hello_world/TencentOS_tiny.ewt index 9ec5a978..a3e79bde 100644 --- a/board/NUCLEO_STM32L073RZ/IAR/hello_world/TencentOS_tiny.ewt +++ b/board/NUCLEO_STM32L073RZ/IAR/hello_world/TencentOS_tiny.ewt @@ -1298,6 +1298,9 @@ $PROJ_DIR$\..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c + + $PROJ_DIR$\..\..\..\..\arch\arm\arm-v7m\common\tos_fault.c + tos/cmsis-os diff --git a/board/NUCLEO_STM32L073RZ/TOS_CONFIG/tos_config.h b/board/NUCLEO_STM32L073RZ/TOS_CONFIG/tos_config.h index 1e4ec2a2..ce475fc4 100644 --- a/board/NUCLEO_STM32L073RZ/TOS_CONFIG/tos_config.h +++ b/board/NUCLEO_STM32L073RZ/TOS_CONFIG/tos_config.h @@ -33,5 +33,7 @@ #define TOS_CFG_TIMER_AS_PROC 1u +#define TOS_CFG_FAULT_BACKTRACE_EN 1u // 配置TencentOS tiny是否开启异常栈回溯功能 + #endif