ARM. Mein Programm bleibt plötzlich stehen.

Gast #331769
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
Gast #331770
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?
Gast #331772
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
Gast #331773
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
Gast #331774
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).

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.