mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 Memorymanagement Exception


Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Als erstes mal die folgende Frage! Wann genau tritt eine 
Memorymanagement Exception beim STM32F103 auf? Geht das überhaupt, denn 
dieser Mikrocontroller besitzt doch keine MPU?

Im Moment besteht mein Programm aus dem Hauptprogramm, einer Timer2-ISR 
, CANRX0-ISR und CANRX1-ISR. Lasse ich zunächst das Programm einfach 
laufen und stoppe es dann, ohne das ein CAN-Interrupt auftritt, wird 
kein Memorymanagement Exception ausgelöst.

Wird eine CAN-Message empfangen, stoppe ich das Programm mit einem 
Breakpoint direkt am Anfang der CAN-ISR's. In diesem Fall fall wird eine 
Memory Exception ausgelöst (Register XPSR.ISR=4). Bis zum Stoppen des 
Programms wird also nur der Interruptannahmezyklus ausgeführt. Wie es in 
diesem Bereich zu einem fehlerhaften Speicherzugriff kommen kann ist mir 
nicht klar.

Habt Ihr da eine Idee?


(ISR = Interruptserviceroutine)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Interrupt: "This is used even if the MPU is disabled or not present, 
to support the Executable Never (XN) regions of the default memory map."

XN ist beispielsweise der Periphieriebereich und: "If an EXC_RETURN 
value is loaded into the PC when in Thread mode, or from the vector 
table, or by any other instruction, the value is treated as an address, 
not as a special value. This address range is defined to have Execute 
Never (XN) permissions, and results in a MemManage fault."

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo A.K.,

Vielen Dank, für Deine schnelle Antwort. Damit muß ich mich erstmal in 
Ruhe auseinandersetzen. Was ist die Quelle für Deine Zitate?

Tschau Sven!

Autor: Sven Woehlbier (woehlb)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
OK, wenn nur das Hauptprogramm und die Timer-ISR ausgeführt wird, tritt 
das Memorymanagment Exception nicht auf. Schicke ich eine CAN-Message 
und stoppe das Programm mit einem Breakpoint direkt am Anfang der 
CANRX-ISR wurde das Memorymanagment Exception ausgelöst. Dabei bleibt 
es.

Stoppe ich in der Timer-ISR zeigt XPSR.ISR=12 an sollte DebugMonitor 
Exception entsprechen.

Deshalb sehe ich nicht das es selbstgeschriebener C-Code sein kann der 
diese Exception auslöst. Demnach müßte eine falsche Adresse in der 
Vectortabelle stehen. Deshalb habe ich einen Auszug aus meinem Map-File 
und den Startup-Code mit gepostet. Meine Entwicklungsumgebung ist das 
Crossworks for ARM von Rowley.

Könntet Ihr bitte über die in der Vectortabelle definierten Adressen 
drüberschauen? Ich finde keine ungültige Adresse.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven Woehlbier schrieb:

> Ruhe auseinandersetzen. Was ist die Quelle für Deine Zitate?

Die Cortex M3 Reference von ARM.

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven Woehlbier schrieb:
> Wie es in diesem Bereich zu einem fehlerhaften Speicherzugriff kommen kann
> ist mir nicht klar.

Einfach mal ins Memory Manage Fault Status Register und Memory Manage 
Fault Address Register schauen.

Gruß
Marcus
http://www.doulos.com/arm/

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also erstmal danke an Alle für Ihre Antworten!

Wie ich gestern herausgefunden habe, gab es kein Exception. Ich bin 
einem Fehler in der Oberfläche von Crossworks for ARM 1.7 aufgesessen.

Wenn man sich die CPU Register mit dem xPSR anzeigen läßt, ist es 
möglich auch ein Register wie einen Verzeichnisbaum aufzuklappen. Dann 
sieht man die Interpretation was welches Bit im Register bedeutet. 
Leider ist das, für das xPSR nicht 100%ig korrekt. Für den gegenwärtig 
ausgeführten Interrupt werden nur die untersten 4 nicht die untersten 8 
Bits ausgewertet.

Für ISR stand statt einer 0x25 nur eine 0x5 oder statt einer 0x24 eine 
0x4. Damit sah es so aus als ob ein Memorymanagement- oder 
BusFault-Exception aufgetreten ist statt der Interrupts CAN_RX0 oder 
CAN_RX1.

@Marcus Harnisch:
Darauf gekommen bin ich, über die von Dir genannten Register, da der 
Status nicht zu einem aufgetretenen Interrupt gepasst hat.

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.