STM32 Memorymanagement Exception

OP #1425872
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)
#1425886
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."
OP #1426104
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.
Angehängte Dateien:
OP #1429298
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren