Warum ein while(1) im HardFault_Handler fahrlässig ist und wie man den Fehler ohne Debugger findet

VS Code IDE während eines hard faults

Warum ein while(1) im HardFault_Handler fahrlässig ist und wie man den Fehler ohne Debugger findet. Wir kennen das Szenario: Das Gerät beim Kunden friert ein. Keine LED blinkt mehr. Totenstille. Ein Reset hilft – bis zum nächsten Mal. Ohne Debugger stehen viele Teams hier im Dunkeln. Dabei liefert uns der ARM Cortex-M Kern alles, was wir zur Diagnose brauchen, frei Haus – wir müssen nur hinsehen. Viele Standard-Projekte (gerade die von Code-Generatoren) implementieren den HardFault_Handler einfach als while(1). Das ist im Labor okay, im Feld aber eine Katastrophe.

💡 Mein Ansatz für schnelles Troubleshooting:

Wenn der Cortex-M in den HardFault springt, pusht er automatisch einen "Stack Frame" auf den Stack. Darin enthalten: R0-R3, R12, LR, xPSR und – das Wichtigste – der Program Counter (PC) zum Zeitpunkt des Absturzes.

Anstatt nur in einer Endlosschleife zu hängen, lese ich diesen PC-Wert aus (und speichere ihn z.B. im EEPROM, .noinit area oder gebe ihn auf der UART aus (das klappt nicht immer - trust me ...).

🔧 Der "Magic Trick" mit der ELF-Datei:

Haben wir die Adresse (z.B. 0x080070EC), brauchen wir keinen teuren Trace-Debugger, um den Übeltäter zu finden. Ein einfaches Tool aus der GNU Toolchain reicht:

arm-none-eabi-addr2line -e firmware.elf 0x080070EC
Das Ergebnis?
../Libs/Modbus/src/modbus_crc.c:40

Und schon wissen wir: Es war der Dereferenzierungs-Fehler in Zeile 40. Keine Magie, nur solides Verständnis der Architektur.


Zurück zur Übersicht