我正在使用IAR来调试在STM32F4 uC上运行的应用程序,并且我得到了一个UsageFault异常,其中CFSR寄存器中的INVSTATE = 1。 在调试日志中,我收到以下消息: UsageFault,尝试在EPSR.T == 0
时执行指令 读了一下之后,我明白LR寄存器应该包含导致故障的命令的地址,但LR寄存器包含0xFFFFFFF1 !!我的问题是:如何获取导致错误的命令的地址?
答案 0 :(得分:0)
您必须展开堆栈以获得正确的LR值,请尝试以下函数:
void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress ) {
/* pulFaultStackAddress: {r0, r1, r2, r3, r12, lr, pc, psr } */
/* These are volatile to try and prevent the compiler/linker optimising them
away as the variables never actually get used. If the debugger won't show the
values of the variables, make them global my moving their declaration outside
of this function. */
volatile uint32_t lr; /* Link register. */
volatile uint32_t pc; /* Program counter. */
volatile uint32_t psr;/* Program status register. */
lr = pulFaultStackAddress[ 5 ];
pc = pulFaultStackAddress[ 6 ];
psr = pulFaultStackAddress[ 7 ];
for(;;)
}
void HardFault_Handler(void) {
__asm volatile
(
" tst lr, #4 \n"
" ite eq \n"
" mrseq r0, msp \n"
" mrsne r0, psp \n"
" ldr r1, [r0, #24] \n"
" b prvGetRegistersFromStack \n"
);
}
当您获得LR时,您可能会发现异常发生的功能。使用一次性窗口获取代码位置。
通常,当用户代码离开数组的边界或使用未初始化的数据指针
时,会发生这种情况