+27
-22
@@ -45,7 +45,6 @@
|
|||||||
extern const int CODE_SECTION_END(CMB_CODE_SECTION_NAME);
|
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_START(CMB_CSTACK_BLOCK_NAME);
|
||||||
extern const int CSTACK_BLOCK_END(CMB_CSTACK_BLOCK_NAME);
|
extern const int CSTACK_BLOCK_END(CMB_CSTACK_BLOCK_NAME);
|
||||||
//TODO 待测试
|
|
||||||
#elif defined(__ICCARM__)
|
#elif defined(__ICCARM__)
|
||||||
#pragma section=CMB_CSTACK_BLOCK_NAME
|
#pragma section=CMB_CSTACK_BLOCK_NAME
|
||||||
#pragma section=CMB_CODE_SECTION_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;
|
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_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;
|
code_size = (uint32_t)&CODE_SECTION_END(CMB_CODE_SECTION_NAME) - code_start_addr;
|
||||||
//TODO 待测试
|
|
||||||
#elif defined(__ICCARM__)
|
#elif defined(__ICCARM__)
|
||||||
main_stack_start_addr = (uint32_t)__section_begin(CMB_CSTACK_BLOCK_NAME);
|
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;
|
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;
|
*start_addr = (uint32_t) OSTCBCur->OSTCBStkBase;
|
||||||
*size = (sp + OSTCBCur->OSTCBStkUsed) - *start_addr;
|
*size = (sp + OSTCBCur->OSTCBStkUsed) - *start_addr;
|
||||||
#else
|
#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 */
|
#endif /* OS_TASK_PROFILE_EN > 0 */
|
||||||
|
|
||||||
//TODO 测试
|
//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;
|
uint32_t stack_pointer = fault_handler_sp, saved_regs_addr = stack_pointer;
|
||||||
const char *regs_name[] = { "R0 ", "R1 ", "R2 ", "R3 ", "R12", "LR ", "PC ", "PSR" };
|
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);
|
CMB_ASSERT(init_ok);
|
||||||
/* only call once */
|
/* only call once */
|
||||||
CMB_ASSERT(!on_fault);
|
CMB_ASSERT(!on_fault);
|
||||||
@@ -559,39 +561,42 @@ void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp) {
|
|||||||
cmb_println("");
|
cmb_println("");
|
||||||
cm_backtrace_firmware_info();
|
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
|
#ifdef CMB_USING_OS_PLATFORM
|
||||||
on_thread_before_fault = fault_handler_lr & (1UL << 2);
|
on_thread_before_fault = fault_handler_lr & (1UL << 2);
|
||||||
/* check which stack was used before (MSP or PSP) */
|
/* check which stack was used before (MSP or PSP) */
|
||||||
if (on_thread_before_fault) {
|
if (on_thread_before_fault) {
|
||||||
cmb_println(print_info[PRINT_FAULT_ON_THREAD], get_cur_thread_name());
|
cmb_println(print_info[PRINT_FAULT_ON_THREAD], get_cur_thread_name());
|
||||||
saved_regs_addr = stack_pointer = __get_PSP();
|
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);
|
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;
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
dump_cur_thread_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
cmb_println(print_info[PRINT_FAULT_ON_HANDLER]);
|
cmb_println(print_info[PRINT_FAULT_ON_HANDLER]);
|
||||||
dump_main_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer);
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
/* bare metal(no OS) environment */
|
/* bare metal(no OS) environment */
|
||||||
cmb_println(print_info[PRINT_FAULT_ON_HANDLER]);
|
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 /* (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 {
|
||||||
|
dump_main_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* bare metal(no OS) environment */
|
||||||
dump_main_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer);
|
dump_main_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer);
|
||||||
#endif /* CMB_USING_OS_PLATFORM */
|
#endif /* CMB_USING_OS_PLATFORM */
|
||||||
#endif /* CMB_USING_DUMP_STACK_INFO */
|
#endif /* CMB_USING_DUMP_STACK_INFO */
|
||||||
|
|||||||
Reference in New Issue
Block a user