Hallo, mein Mikrocontroller springt immer wieder mal in den HardFault-Handler. War erst sehr unregelmäßig tritt aber immer häufiger auf. Ich habe mal die Fault-Register ausgelesen und bin so darauf gestoßen, dass im Usage Fault Status Register das "INVSTATE"-Bit gesetzt ist. Im User-Manual steht dazu folgendes: "Invalid state usage fault: 0 = no invalid state usage fault 1 = the processor has attempted to execute an instruction that makes illegal use of the EPSR. When this bit is set to 1, the PC value stacked for the exception return points to the instruction that attempted the illegal use of the EPSR. This bit is not set to 1 if an undefined instruction uses the EPSR." Das EPSR ist das Execution Program Status Register. Dazu steht im Maunal: "The EPSR contains the Thumb state bit, and the execution state bits for either the: • If-Then (IT) instruction • Interruptible-Continuable Instruction (ICI) field for an interrupted load multiple or store multiple instruction." Falls es von Bedeutung ist: Ich programmiere in C. Wieso tritt dieser Fehler auf? Was ist ein unerlaubter Zugriff auf das EPSR?
Benutzt du ein Betriebssystem in deinem Projekt? Greifst du direkt auf Register zu z.B. mit inline Assembler, oder bewegst du dich nur in der C-Syntax? Hast du den englischen Text verstanden? Wenn das INVSTATE-Bit gesetzt ist, steht im PC-Register die Adresse der Instruktion drin, die den Fehler verursacht hat. Du kannst dann im Dissassembly sehen wo der Fehler verusacht wurde, wenn du an die Adresse gehst.
Ich dachte ich hätte den text verstanden ;) Danke für den Tip! Ich verwende kein Betriebssystem und benutze auch keine Assembleranweisungen. Alles C-Syntax!
NB: Es gibt im NVIC eine Einstellung für diverse Faults wie etwa Bus Fault und Usage Fault. Ab Reset sind die abgeschaltet und laufen daher alle auf den Hardfault, was die Unterscheidung der eigentlichen Ursache etwas erschweren kann.
Ist es ungewöhnlich dass man im Disassembly nicht sofort durchsieht? Also ich erkenne da Assembleranweisungen wo er Register hin und her schiebt usw. Aber wo finde ich da die Stelle wo der Hard Fault auftritt? Nach dem NVIC guck ich gleich mal.
INVSTATE deutet darauf hin, dass eine Sprungadresse falsch ist. Beispielsweise eine defekte Return-Adresse aufgrund Pufferüberlauf in der Funktion.
R. B. schrieb: > Nach dem NVIC guck ich gleich mal. Genau genommen nicht im NVIC, sondern im SCB: SCB_SHCSR
R. B. schrieb: > Aber wo finde ich da die Stelle wo der Hard Fault auftritt? Die Return-Adresse liegt auf dem Stack (PC). Siehe unter "Exception entry" im User Manual. Jürgen
Also ich habe jetzt einfach mal die Größe des Stacks verdoppelt und es läuft wieder! Danke für eure Ratschläge =)
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.