Hallo! Leider gibt es in meinem Programm irgendwo einen Fehler, bei dem der Controller (STM32; Cortex-M4) in den Hardware Fault springt. Da der Fehler irgendwann auftritt und nicht reproduzierbar ist, wäre es für die Fehlersuche hilfreich zu wissen, von wo der Sprung in die Hardwarefault ISR erfolgt ist. Gibt es da einen Tipp/Trick? Danke & Grüße Timo
Achso, der Callstack ist im übrigen leer. Sonst wäre es ja einfach ... ;)
Hier meine Funktion, um Hardfaults (nicht Hardware Faults) generell abzufangen. In Crasreport stehen dann alle releavanten Informationen
1 | typedef struct sCrashReport |
2 | {
|
3 | uint32_t lr; |
4 | uint32_t pc; |
5 | uint32_t psr; |
6 | uint32_t bfar; |
7 | uint32_t cfsr; |
8 | uint32_t hfsr; |
9 | uint32_t dfsr; |
10 | uint32_t afsr; |
11 | } __attribute__((packed)) tCrashReport; |
12 | |
13 | /**
|
14 | * @brief This function handles Hard Fault exception.
|
15 | * @param None
|
16 | * @retval None
|
17 | */
|
18 | void HardFault_Handler_C(uint32_t* hardfault_args) |
19 | {
|
20 | // Creating crash report
|
21 | crashReport.lr = ((uint32_t) hardfault_args[5]); |
22 | crashReport.psr = ((uint32_t) hardfault_args[7]); |
23 | crashReport.bfar = (*((volatile uint32_t *)(0xE000ED38))); |
24 | crashReport.cfsr = (*((volatile uint32_t *)(0xE000ED28))); |
25 | crashReport.hfsr = (*((volatile uint32_t *)(0xE000ED2C))); |
26 | crashReport.dfsr = (*((volatile uint32_t *)(0xE000ED30))); |
27 | crashReport.afsr = (*((volatile uint32_t *)(0xE000ED3C))); |
28 | |
29 | // Handle crash report
|
30 | WdgExecuteCrashReport((uint32_t) hardfault_args[6]); |
31 | }
|
32 | |
33 | void __attribute__ ((naked)) HardFault_Handler( void ) |
34 | {
|
35 | __ASM("TST LR, #4"); |
36 | __ASM("ITE EQ"); |
37 | __ASM("MRSEQ R0, MSP"); |
38 | __ASM("MRSNE R0, PSP"); |
39 | __ASM("B HardFault_Handler_C"); |
40 | }
|
Harderror schrieb: > Achso, der Callstack ist im übrigen leer. Sonst wäre es ja einfach ... > ;) Dann suche mal nach einem Stack Overflow in Deinem Code.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.