Forum: Mikrocontroller und Digitale Elektronik Hard Fault bei Cortex M3


von Robert B. (rsb89)


Lesenswert?

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?

von Star K. (starkeeper)


Lesenswert?

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.

von Robert B. (rsb89)


Lesenswert?

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!

von (prx) A. K. (prx)


Lesenswert?

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.

von Robert B. (rsb89)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

INVSTATE deutet darauf hin, dass eine Sprungadresse falsch ist. 
Beispielsweise eine defekte Return-Adresse aufgrund Pufferüberlauf in 
der Funktion.

von (prx) A. K. (prx)


Lesenswert?

R. B. schrieb:
> Nach dem NVIC guck ich gleich mal.

Genau genommen nicht im NVIC, sondern im SCB: SCB_SHCSR

von Juergen (Gast)


Lesenswert?

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

von Robert B. (rsb89)


Lesenswert?

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
Noch kein Account? Hier anmelden.