www.mikrocontroller.net

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


Autor: Harald Wilczak (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dominic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.