Forum: Mikrocontroller und Digitale Elektronik ARM. Mein Programm bleibt plötzlich stehen.


von Harald Wilczak (Gast)


Lesenswert?

Hallo,

ich habe ein grösseres Programm mit Crossworks für ARM geschrieben und
dieses bleibt an unterschiedlichen Stellen stehen.

Wenn ich Breakpoints auf die Einsprünge "PABORT" und "UNDEF" lege,
werde diese bei dem Abbruch des Programmes angesprungen.

Was heisst das und wie kann es beheben.

Danke
Harry

von Stefan (Gast)


Lesenswert?

Das hört sich danach an, als ob der Prozessor auf illegalen Code stösst.
Läuft dein Programm im RAM oder im ROM?

Eine Ursache bei beiden Codepositionen kann sein, dass du einen
Stacküberlauf hast und Rücksprungadressen von Unterprogrammaufrufen
zerschossen werden. Reicht dein Stack für die Programmgrösse aus?

Ein Überschreiben von Speicherbereichen (Arraygrenzen?, Fehlende
'\0' bei Stringoperationen,...) kann auch den Stack demolieren.

Bei Code im RAM kann auch der Programmcode durch missweisende Pointer
beschädigt werden.

Eher exotische Fehlerquellen sind bei variablen Argumentlisten zu
erwarten.

Wenn du so schön im Debugger landest, kannst du dir bestimmt die
Stackframes der letzten paar Aufrufe anzeigen lassen. Gibt es
Gemeinsamkeiten, woher das Programm dann kommt?

von Stefan (Gast)


Lesenswert?

Eine weitere Fehlermöglichkeit für diese beiden Exceptions ist, dass
illegale Speicheradressen angesprochen werden. Naturgemäß sind
Pointeroperationen die ersten Verdächtigen hierfür.

von Dietmar (Gast)


Lesenswert?

Ließ mal das User Manual über die verschiedenen Betriebsmodi des ARM:

PABORT (Prefetch Abort) tritt auf, wenn ein illegaler, d.h. nicht
vorhandener, Speicherbereich adressiert wird (indirekt durch Pointer
z.B.).

UNDEF (Undefined) tritt z.B. nach Mode-Wechsel oder bei nicht korrekter
ARM-Thumb-Umschaltung auf (bei mir letztens Aufruf einer ISR als
Funktion aus einer ISR heraus, auf C-Compiler-Ebene, geht bei ARM nicht
so ohne weiteres!).

Gruß

Dietmar

von Dietmar (Gast)


Lesenswert?

Arbeite mit Keil µVision für ARM.

Dort sind in der Startup.s bereits Interruptvektoren für PAbt und Undef
vorinstalliert. Habe die Adressen auf 2 entsprechende zunächst leere
Funktionen in C umgeleitet, so daß dort zumindest das Programm nicht
hängen bleibt. Ist ein erster Ansatz.

Wenn das Programm in Ordnung ist, sollte man dort niemals landen. Darum
habe ich in diesen leeren Funktionen wenigstens einen Zähler
installiert, der anzeigt, ob dort jemals was passiert.

Gruß

Dietmar

von Dominic (Gast)


Lesenswert?

Prefetch Abort (im Gegensatz zum Data Abort) tritt nicht durch
fehlerhafte Adressierung via Pointer auf, sondern bei einem instruction
fetch abort. Das Programm ist also an eine Speicheradresse gesprungen,
an der kein Speicher liegt, oder die nicht durch vier (zwei bei Thumb)
teilbar ist.

Undefined ist ganz einfach ein ungueltiger Opcode. Das kann natuerlich
passieren, wenn Thumb Code im ARM Modus ausgefuehert wird,
wahrscheinlicher ist aber auch da ein Sprung in einen Bereich, der
keinen sinnvollen Code enthaelt (besonders angesichts der Prefetch
Aborts).

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.