2017-09-19 103 views
0

我使用IAR调试我的应用程序,它是在STM32F4的uC运行,我得到一个用法错误例外其中CFSR寄存器中的INVSTATE = 1。 调试日志,我得到了以下信息: 用法错误,尝试当EPSR.T == 0使用法错误处理程序STM32F4

读了一下后,我明白,LR寄存器应导致该命令的地址执行指令故障,但是,LR寄存器包含0xFFFFFFF1!

我的问题是:我怎么能得到导致错误的命令的地址?

回答

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你会发现可能的功能。使用一次性窗户获取代码位置。

通常情况下,这发生在用户代码离开阵列边界或使用未初始化的数据指针时

相关问题