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
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?
Eine weitere Fehlermöglichkeit für diese beiden Exceptions ist, dass illegale Speicheradressen angesprochen werden. Naturgemäß sind Pointeroperationen die ersten Verdächtigen hierfür.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.