Forum: Mikrocontroller und Digitale Elektronik Hard Fault beim ATSAM3S (Cortex-M3)


von Albert .. (albert-k)


Lesenswert?

Hallo zusammen
Ich habe ein Problem mit besagten Controller. und zwar springt mir der 
Cortex immer beim Empfangen von bytes über UART in den HardFault.

Über den Fault Registern sind die Bits für
- FORCED
- INVSTATE
gesetzt. Das FORCED bedeutet das es ursprünglich kein Hard Fault war der 
aufgetreten ist, sondern dieser durch einen Fault im Fault aufgetreten 
ist.

INVSTATE sagt mir das der PC auf dem Stack auf den für den Fault 
schuldigen befehl zeigt.

Der Stack zeigt folgendes:
1: 0x20002FAE = R0
2: 0x20002F7E = R1
3: 0x00000000 = R2
4: 0x00000000 = R3
5: 0x00000008 = R12
6: 0x00401007 = LR
7: 0x00000000 = PC
8: 0xA0000000 = PSR

Der Zeiger des LR zeigt auf den Befehl
0xb003    ADD SP,SP,#0xc

Ich verstehe jetzt nicht wie es du der Exception kommen konnte? Hat 
jemand eine Idee wie ich das nun Sinnvoll debugge?
Ich hätte jetzt anhand der gesetzten Bits gedacht das die 
rücksprungaddresse bei BIT 0 eine 0 stehen hat (dies bewirkt einen 
Fehler da der Cortex in den ARM Mode wechseln möchte, dies aber nicht 
geht). Dies ist aber laut Linkerregister nicht der Fall.

Jemand ne Idee wonach man suchen könnte?

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Albert ... schrieb:
> INVSTATE sagt mir das der PC auf dem Stack auf den für den Fault
> schuldigen befehl zeigt.

Vielleicht habe ich Dich missverstanden, aber INVSTATE zeigt an, dass
man versucht hat in einen ungültigen Zustand zu
wechseln. Beispielsweise, durch laden des PC mit einer geraden
Adresse. Hast Du mal Deine Sprungadressen überprüft?

> Der Stack zeigt folgendes:
> 1: 0x20002FAE = R0
> 2: 0x20002F7E = R1
> 3: 0x00000000 = R2
> 4: 0x00000000 = R3
> 5: 0x00000008 = R12
> 6: 0x00401007 = LR
> 7: 0x00000000 = PC
> 8: 0xA0000000 = PSR
>
> Der Zeiger des LR zeigt auf den Befehl
> 0xb003    ADD SP,SP,#0xc

Aber das stacked LR ist das des Applikationskontexts, nicht die
Rücksprungadresse des Handlers. Die Rücksprungadresse ist im stacked
PC und der ist 0. Was im übrigen auch den Fehler erklärt.

> Ich verstehe jetzt nicht wie es du der Exception kommen konnte? Hat
> jemand eine Idee wie ich das nun Sinnvoll debugge?

Bad pointer?

Gruß
Marcus

von Albert .. (albert-k)


Lesenswert?

Hallo
Du hast recht, es war ein Sprung auf die Adresse 0x00000000. Bei mir 
entstand es durch eien falsche Abbruchbedingung bei einem 
pointerincrement.
Fehler ist nun behoben

von Tartaruga (Gast)


Angehängte Dateien:

Lesenswert?

Hi Leute

Ich programmiere einen Cortex M3 (STM32) dabei kommuniziere ich über die 
UART mit einem Bluetooth Modul. Wenn ich Daten von diesem empange 
bekomme ich nach einiger Zeit (ca. 2 - 3 sek) ebenfalls einen Hard 
Fault. Ich arbeite mit Keil 3.8. Ich hab die gestellten Register in als 
Anhang hochgeladen.

Ich hab leider keine Ahnung wie ich das Problem angehen soll, hat werd 
eine Idee wie ich dem Übel auf die Spur komme

Danke
Tartaruga

von Tartaruga (Gast)


Lesenswert?

Hi

Warum wird eine Hard Fault Routine gestartet obwohl es sich eigentlich 
um einen Instruction bus error handelt????
Ich hab auch eine ISR für den BusFaultError aber diese wird nie 
verwendet.

Hat wer eine Idee wie ich das debuggen kann?

Danke
lg
Tartaruga

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Tartaruga schrieb:
> Hat wer eine Idee wie ich das debuggen kann?

Mal ins SHCSR geschaut?
http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337g/Cihcbadd.html#Cihieffb

--
Marcus

von frank (Gast)


Lesenswert?

Moin,

würde auch gerne mit diesem Controller spielen. Wo hast du ihn 
erstanden?

Grüße

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.