2017-09-19 2 views
0

Ich verwende IAR, um meine Anwendung zu debuggen, die auf STM32F4 uC ausgeführt wird, und ich bekomme eine Ausnahme von UsageFault, wo die INVSTATE = 1 in CFSR-Register. in der Debug-Log bekomme ich folgende Meldungen: UsageFault, Versuch, einen Befehl auszuführen, wenn EPSR.T == 0aktivieren UsageFault Handler in STM32F4

nach ein wenig Lektüre ich, dass die LR-Register verstehen die Adresse des Befehls enthalten sollte, die die verursacht Fehler, LR-Register enthält jedoch 0xFFFFFFF1 !!

meine Frage ist: Wie bekomme ich die Adresse des Befehls, der den Fehler verursacht?

Antwort

0

Sie haben einen Stapel zu erweitern richtige LR Wert zu erhalten, versuchen Sie bitte die folgende Funktion:

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

Wenn Sie LR erhalten Sie möglich gefunden Funktion wo Ausnahme auftreten. Verwenden Sie Einmalfenster, um den Codeort zu erhalten.

In der Regel geschieht dies, wenn der Benutzercode die Grenzen des Arrays verlässt oder den nicht initialisierten Datenzeiger

verwendet