CortexM3 Hardfault Handler

OP (Firma: DC3AX) #1950524
Lesenswert?
• ▲
▼
Hallo!

Ich versuche gerade einen eigenen Handler für die diversen Exceptions 
des CortexM3 zu schreiben. Es geht darum eine Art Bluescreen über die 
Serielle auszugeben, wenn eine Exception oder ein nicht definierter 
Interrupt auftritt.

Es gibt dazu ein paar Codebeispiele, die jedoch scheinbar nur dann 
funktionieren, wenn ein RTOS im Hintergrund läuft. Das ist bei mir nicht 
der Fall.

Das Problem ist, dass mein Handler funktioniert, wenn ich per 
gdb/insight verbunden bin. Lasse ich das Programm so laufen, fällt die 
CPU immer in STOP mit Hardfault statt meinen Handler aufzurufen.

Ich habe die Doku (STM32F10x PM0056.pdf) so verstanden, dass man die 
entsprechenden Register nur im Privileged Mode setzen darf. Im Exception 
Handler wird wohl auch der PSP Stack Pinter verwendet, statt dem MSP.
Also habe ich die Initialisierung so durchgeführt:
1
    /* Set privileged mode */
2
    __set_PSP((uint32_t)&_pspstack_end);
3
    __set_CONTROL(0x0);
4
    SCB->SHCSR |= (SCB_SHCSR_MEMFAULTENA|SCB_SHCSR_BUSFAULTENA|SCB_SHCSR_USGFAULTENA);
5
    /* Set back Thread mode */
6
    __set_CONTROL(0x1);
Es ist aber weiterhin so, dass im SHCSR statt der erhofften 0x00070000 
nur 0x00020000 steht.
Starte ich das ganze bei laufendem Debugger, funktioniert es prächtig.

Irgendeine Idee?

Gruß, Ulrich
Persönliche Seite #1950724
Lesenswert?
• ▲
▼
Ulrich P. schrieb:
> Im Exception Handler wird wohl auch der PSP Stack Pinter verwendet,
> statt dem MSP.

Das geht nicht. Exception Handler verwenden immer den MSP.

> Also habe ich die Initialisierung so durchgeführt:

Wo befindest Du Dich denn während der Code ausgeführt wird?
1
     __set_CONTROL(0x0);

Dieses Kommando ändert das CONTROL Register ohnehin nur, wenn Du
bereits privilegiert bist. Du kannst damit keine Privilegien erlangen.

Es ist übrigens keine gute Idee, mit dem selben Problem in
verschiedenen Threads anzukommen.

Viel Erfolg
Marcus

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.