Forum: Mikrocontroller und Digitale Elektronik STM32 Memorymanagement Exception


von Sven W. (woehlb)


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)

von (prx) A. K. (prx)


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."

von Sven W. (woehlb)


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!

von Sven W. (woehlb)


Angehängte Dateien:

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.

von (prx) A. K. (prx)


Lesenswert?

Sven Woehlbier schrieb:

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

Die Cortex M3 Reference von ARM.

von Marcus H. (mharnisch) Benutzerseite


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/

von Sven W. (woehlb)


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.

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
Noch kein Account? Hier anmelden.