Hallo, das Problem ist, dass ich mit einem Programm das schon etwas komplexer ist zu ungewissen Zeitpunkten in einen Hardfault laufe. Was kann denn alles die Ursache sein? Mir fällt eigentlich nur ein: 1. Schreiben über Arraygrenzen 2. Lesen außerhalb von Arraygrenzen? --- Da bin ich mir schon nicht so sicher 3. weiteres?
Ich hatte mal einen unaligned 32 Bit Pointer (uint32_t*), und der Compiler hat eine LDRD Instruktion für einen 8 Byte Load generiert. Danach sucht man sich dusselig. Ansonsten: Breakpoint im Handler setzen und im Debugger mal den Call Stack anschauen.
Und was steht im SP so drin? Lass Dir doch nicht alles aus der Nase ziehen, so kann Dir keiner helfen.
HardFault schrieb: > 3. weiteres? Debugger und Logic Analyzer dran und alles aufzeichnen. Anschließend prüfen, wann das Problem auftrat. Anschließend passende Stelle im Quellcode suchen.
Da wirst Du dich langsam an die kritische Stelle vortasten müssen. Was heisst denn "ein Programm das schon etwas komplexer ist"? 1000 Zeilen, 10000, 100.000? In der Regel ist doch eine Ausgabemöglichkeit vorhanden (Debug, Trace, Seriell, LCD-Display...) Komplexe Programme tun in der Regel auch was. ;-) Lass Dir regelmässig Ausgaben zum Programmstatus geben. Es wird dir keiner ein Rezept geben können, das Finden so eines Fehlers kann schwierig sein...
HardFault schrieb: > 3. weiteres? Vileicht einfach danach googlen "arm cortex m4 hard fault handler" 3 Beliebige Treffer beschreiben das ganze sehr gut. https://blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler/ https://blog.feabhas.com/2013/02/developing-a-generic-hard-fault-handler-for-arm-cortex-m3cortex-m4/ http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html Cheers
HardFault schrieb: > einen Hardfault HardFault schrieb: > ist leider empty Brauchst du mal ein deutsches Wörterbuch?
> Autor: HardFault (Gast)
Der Benutzer ist der hard fault ...
Gruß
Jobst
- Zugriff auf ungültigen Pointer -> insbesondere Funktionspointern - Fehlerhaftes Memory Management - Fehlern von Peripherie die nicht mit eignen Handlern abgefangen werden. - usw. alles das was sich bei einer sauberen Programmierung vermeiden lässt. Die auch in der Lage ist Fehler abzufangen.
eine Frage noch: Kann das Lesen oberhalb von Arraygrenzen zu HardFault Fehlern führen, oder muss man dafür schon scheibend drauf zugreifen?
HardFault schrieb: > Kann das Lesen oberhalb von Arraygrenzen zu HardFault Fehlern führen, > oder muss man dafür schon schreibend drauf zugreifen? Das interessiert den Cortex-M Core nicht. Der weiß nichts von deinem Array. Die Frage ist nur, ob hinter deinem Array gültiger Speicher liegt. Hier findest du eine App Note https://www.segger.com/downloads/appnotes/AN00016_AnalyzingHardFaultsOnCortexM.pdf und den passenden HardFault Handler: https://www.segger.com/downloads/appnotes/HardFaultHandler.zip
So wird das sowieso nichts. Du musst schon den Programmabschnitt isolieren, wo der Fehler auftritt. Debugging oder Logikanalyse wurde doch schon genannt, aber auch Hilfsvariable mit Output können helfen, aber wenn ein Programmierer Spaghetticode schreibt, kannst du hier so viel posten bis die Finger wund sind, es bringt dich nicht weiter.
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.