2017-09-19 27 views
0

私はSTM32F4 uCで実行されているアプリケーションをIARを使用してデバッグしていますが、CFSRレジスタのINVSTATE = 1ではUsageFault例外が発生します。デバッグログで 私は、次のメッセージが出ます:EPSR.T == 0STM32F4でUsageFaultハンドラを有効にする

ビットを読んだ後、私はLRレジスタは、原因となったコマンドのアドレスが含まれている必要があることを理解し UsageFault、命令を実行しようとする試みをただし、LRレジスタには0xFFFFFFF1が含まれています。

私の質問は:どのようにして、フォルトの原因となったコマンドのアドレスを取得できますか?あなたは正しいLR値を取得するには、スタックを展開する必要が

答えて

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" 
     ); 
} 

あなたが可能な例外を発生する機能を見つけます。ディスポーザブルウィンドウを使用してコードの場所を取得します。

通常、ユーザーコードが配列の境界を離れるか、初期化されたデータポインタを使用しない場合に発生します。

関連する問題