从任务堆栈跳转到HardFault之前,R0~R3, R12, LR,PC,xPSR等也是需要自动压栈的,这里在先将Sp指针减去这些偏移后再判定是否溢出,觉得有点不妥,
(2)cm_backtrace_call_stack函数中
/ second depth is from LR, so need decrease a word to PC /
pc = regs.saved.lr - sizeof(size_t);
if ((pc >= code_start_addr) && (pc <= code_start_addr + code_size) && (depth <
CMB_CALL_STACK_MAX_DEPTH)
&& (depth < size)) {
buffer[depth++] = pc;
regs_saved_lr_is_valid = true;
}
这里如果是保存lr寄存器的话应该是regs.saved.pc - sizeof(size_t);如果按照上面的,保存的应该是R12。
@armink
疑问1: / 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)
endif / (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7) /
ifdef CMB_USING_DUMP_STACK_INFO
endif / CMB_USING_DUMP_STACK_INFO /
从任务堆栈跳转到HardFault之前,R0~R3, R12, LR,PC,xPSR等也是需要自动压栈的,这里在先将Sp指针减去这些偏移后再判定是否溢出,觉得有点不妥, (2)cm_backtrace_call_stack函数中 / second depth is from LR, so need decrease a word to PC / pc = regs.saved.lr - sizeof(size_t); if ((pc >= code_start_addr) && (pc <= code_start_addr + code_size) && (depth < CMB_CALL_STACK_MAX_DEPTH) && (depth < size)) { buffer[depth++] = pc; regs_saved_lr_is_valid = true; } 这里如果是保存lr寄存器的话应该是regs.saved.pc - sizeof(size_t);如果按照上面的,保存的应该是R12。 @armink