From 25ebcab3a12bc35b05a50e93c60e3ede2c6fa971 Mon Sep 17 00:00:00 2001 From: armink Date: Thu, 29 Dec 2016 11:09:17 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E7=BB=86=E8=8A=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: armink --- cm_backtrace/cm_backtrace.c | 43 +++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/cm_backtrace/cm_backtrace.c b/cm_backtrace/cm_backtrace.c index 789906d..cd62549 100644 --- a/cm_backtrace/cm_backtrace.c +++ b/cm_backtrace/cm_backtrace.c @@ -45,7 +45,6 @@ extern const int CODE_SECTION_END(CMB_CODE_SECTION_NAME); extern const int CSTACK_BLOCK_START(CMB_CSTACK_BLOCK_NAME); extern const int CSTACK_BLOCK_END(CMB_CSTACK_BLOCK_NAME); - //TODO ´ý²âÊÔ #elif defined(__ICCARM__) #pragma section=CMB_CSTACK_BLOCK_NAME #pragma section=CMB_CODE_SECTION_NAME @@ -199,7 +198,6 @@ void cm_backtrace_init(const char *firmware_name, const char *hardware_ver, cons main_stack_size = (uint32_t)&CSTACK_BLOCK_END(CMB_CSTACK_BLOCK_NAME) - main_stack_start_addr; code_start_addr = (uint32_t)&CODE_SECTION_START(CMB_CODE_SECTION_NAME); code_size = (uint32_t)&CODE_SECTION_END(CMB_CODE_SECTION_NAME) - code_start_addr; - //TODO ´ý²âÊÔ #elif defined(__ICCARM__) main_stack_start_addr = (uint32_t)__section_begin(CMB_CSTACK_BLOCK_NAME); main_stack_size = (uint32_t)__section_end(CMB_CSTACK_BLOCK_NAME) - main_stack_start_addr; @@ -244,7 +242,7 @@ static void get_cur_thread_stack_info(uint32_t sp, uint32_t *start_addr, size_t *start_addr = (uint32_t) OSTCBCur->OSTCBStkBase; *size = (sp + OSTCBCur->OSTCBStkUsed) - *start_addr; #else - #error "OS_TASK_PROFILE_EN isn't enable in 'OS_CFG.H'" + #error "OS_TASK_PROFILE_EN isn't enable in 'OS_CFG.H'" #endif /* OS_TASK_PROFILE_EN > 0 */ //TODO ²âÊÔ @@ -550,6 +548,10 @@ void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp) { uint32_t stack_pointer = fault_handler_sp, saved_regs_addr = stack_pointer; const char *regs_name[] = { "R0 ", "R1 ", "R2 ", "R3 ", "R12", "LR ", "PC ", "PSR" }; +#ifdef CMB_USING_DUMP_STACK_INFO + uint32_t stack_start_addr = main_stack_start_addr, stack_size = main_stack_size; +#endif + CMB_ASSERT(init_ok); /* only call once */ CMB_ASSERT(!on_fault); @@ -559,39 +561,42 @@ void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp) { cmb_println(""); cm_backtrace_firmware_info(); - /* delete saved R0~R3, R12, LR, PC, xPSR registers address */ - stack_pointer += sizeof(size_t) * 8; - -#if (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7) - stack_pointer = statck_del_fpu_regs(fault_handler_lr, stack_pointer); -#endif - -#ifdef CMB_USING_DUMP_STACK_INFO - uint32_t stack_start_addr = main_stack_start_addr, stack_size = main_stack_size; #ifdef CMB_USING_OS_PLATFORM on_thread_before_fault = fault_handler_lr & (1UL << 2); /* check which stack was used before (MSP or PSP) */ if (on_thread_before_fault) { cmb_println(print_info[PRINT_FAULT_ON_THREAD], get_cur_thread_name()); saved_regs_addr = stack_pointer = __get_PSP(); + +#ifdef CMB_USING_DUMP_STACK_INFO get_cur_thread_stack_info(stack_pointer, &stack_start_addr, &stack_size); +#endif /* CMB_USING_DUMP_STACK_INFO */ - /* delete saved R0~R3, R12, LR,PC,xPSR registers space */ - stack_pointer += sizeof(size_t) * 8; + } else { + cmb_println(print_info[PRINT_FAULT_ON_HANDLER]); + } +#else + /* bare metal(no OS) environment */ + cmb_println(print_info[PRINT_FAULT_ON_HANDLER]); +#endif /* CMB_USING_OS_PLATFORM */ + + /* delete saved R0~R3, R12, LR,PC,xPSR registers space */ + stack_pointer += sizeof(size_t) * 8; #if (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7) - stack_pointer = statck_del_fpu_regs(fault_handler_lr, stack_pointer); -#endif + stack_pointer = statck_del_fpu_regs(fault_handler_lr, stack_pointer); +#endif /* (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7) */ + /* dump stack information */ +#ifdef CMB_USING_DUMP_STACK_INFO +#ifdef CMB_USING_OS_PLATFORM + if (on_thread_before_fault) { dump_cur_thread_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer); - } else { - cmb_println(print_info[PRINT_FAULT_ON_HANDLER]); dump_main_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer); } #else /* bare metal(no OS) environment */ - cmb_println(print_info[PRINT_FAULT_ON_HANDLER]); dump_main_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer); #endif /* CMB_USING_OS_PLATFORM */ #endif /* CMB_USING_DUMP_STACK_INFO */