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)
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."
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!
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.
Sven Woehlbier schrieb: > Ruhe auseinandersetzen. Was ist die Quelle für Deine Zitate? Die Cortex M3 Reference von ARM.
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/
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.