Frage

Ich habe ein eingebettetes Projekt STM32F103 (ARM Cortex M3) verwendet wird, wird es einen gelegentlich immer schweren Fehler im Release-Modus zu bekommen. Im Rahmen der Erholung, würde Ich mag den PC-Wert abzurufen, aus der Zeit vor dem harten Fehler und speichern Sie es später für batteriegepufferte Region im Debuggen.

Wie würde ich den Wert des Programmzählers an der Stelle des harten Fehlers bestimmen? Offensichtlich ist der PC nun auf seine Position innerhalb der hardfault Unterbrechung.

Wo soll ich schauen? Es gibt eine Adresse für die normale Modus Registerbank?

Danke!

War es hilfreich?

Lösung

Cortex-M3 verwendet ein ganz anderes Modell der Ausnahmebehandlung aus dem „klassischen“ ARM, z.B. es muss nicht „Abbruchmodus“, in dem anderen Beitrag erwähnt. Ich schlage vor, Sie zu lesen diese App note . Zum Beispiel für die harten Fehler:

Der Wert von SCB-> BFAR gibt die Speicheradresse, die einen Bus Fault verursacht und ist gültig, wenn das Bit BFARVALID im SCB-> CFSR Register gesetzt ist. Das Wert von SCB-> MMFAR gibt die Speicheradresse, die einen Speicher verursacht Management Fehler und ist gültig, wenn das Bit MMFARVALID in der SCB-> CFSR Register gesetzt.

Um den PC-Wert zum Zeitpunkt der Ausnahme bestimmen müssen Sie den Stapel prüfen; der Prozessor schiebt R0-R3, R12, PC und LR, bevor die Prozedur ausgeführt wird. Der Stapel verwendet wird, kann entweder Main (wenn Bit 2 von LR ist 0) oder Verfahren (sonst) sein. Siehe Seite 13 der App Notiz für Details.

Andere Tipps

Sie sollten den Blick in ARM Architektur Referenzhandbuch in der Abschnitt über Ausnahmen. Sie müssen sich registrieren, um es zu bekommen.

Typischerweise wird eine relevante Adresse wird im Verknüpfungsregister LR (R14) gesetzt werden, aber die genaue Bedeutung variiert je nach der Ausnahme, und es gibt unterschiedliche Offsets.

w.r.t. die Benutzer / System-Modus Registerbank zugreifen, ich glaube, Sie den Modus auf Zugang zu wechseln brauchen.

Wenn eine Ausnahme auftritt, wird die Prozessor-Zustandsänderung von dem aktuellen Zustand in den Abbruch Zustand. Im Abbruchzustand einen neuen Satz von Registern für SP und lr (sp_abt und sp_lr der Prozessors Verschiebungen jeweils zu verwenden. Für ein Datum abbrechen kann die säumige Anweisung über in lr_abt + 4 (gemäß in lr_abt + 8 für ein prefect gefunden werden das ARMv7 Architecure Referenzhandbuch)

Ich habe eine FAQ zu diesem Thema. Die Seite aus dem FAQ verknüpft enthält Fehlerbehandlungscode , der den Programmzähler aus dem Stapel für Sie erhalten.

Ich fand eine gemeinsame Ursache für diese Probleme sind die ‚for-Schleife‘ Verzögerungen. Wenn O3 mit bekommen sie einfach wegoptimiert, wenn Sie nicht auf flüchtige Variablen beziehen, werden. Persönlich ziehe ich den SysTick Ansatz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top