Busfault sobald cpsie i - Interrupt vorher sehen (STM32CubeIDE)

OP #7073459
Lesenswert?
• ▲
▼
Beim Debuggen eines Assemblerprogramms eines STM32F407 passiert es, daß 
nach Durchlaufen einer gewissen Initialisierungsphase, in der ich schon 
mittels Nachrichten in der SWV ITM Konsole den Programmverlauf verfolgen 
kann, daß es einen BUSFAULT (Exception Code 5) gibt. Das passiert genau 
in dem Moment, wo ich Interrupts einschalte (cpsie i). Die Instruktion 
nach dem cpsie ist ein "b next". Führe ich die als nächstes nach dem 
cpsie aus, so gibt es eine Exception 5 (Busfault).

Der SP hat dann leider einen Wert, der keine gültige Adresse darstellt 
(Zahl 00000007).

Meine Frage jetzt: Wie könnte ich feststellen, welcher Interrupt u.U. 
bereits in dem Moment anliegt, da ich die Interrupts enable?

Anm.: Ich habe IWDG im STM32CubeIDE während des Debuggens abgeschaltet.
Was das für den Moment bedeutet, wo das Programm läuft (und wenn es nur 
eine Instruktion ist), weiß ich nicht genau. Kann also nicht genau 
sagen, ob des der Watchdog ist, der mir da hineinhagelt oder etwas 
anderes. Das würde ich eben gerne feststellen. Auf dem Systick-Vektor 
passiert auch nichts.
#7073487
Lesenswert?
• ▲
▼
Christoph K. schrieb:
> Kann also nicht genau sagen, ob des der Watchdog ist,
> der mir da hineinhagelt oder etwas anderes.

Der IWDG kann keinen Interrupt auslösen, nur einen Reset. Nur der WWDG 
hat ein Interrupt Enable und einen eigenen Vector.

> BUSFAULT...genau in dem Moment, wo ich Interrupts einschalte (cpsie i).

Die Interrupts sind nach einem Reset automatisch eingeschaltet. Wenn du 
sie nicht selbst ausschaltest, kann cpsie eigentlich nichts bewirken.

Noch eine doofe Idee: ist der Stackpointer (MSP) kurz vor dem cpsie 
(noch) richtig intialisiert?
OP #7073506
Lesenswert?
• ▲
▼
Bauform B. schrieb:
> Christoph K. schrieb:
>> Kann also nicht genau sagen, ob des der Watchdog ist,
>> der mir da hineinhagelt oder etwas anderes.
>
> Der IWDG kann keinen Interrupt auslösen, nur einen Reset. Nur der WWDG
> hat ein Interrupt Enable und einen eigenen Vector.
>
>> BUSFAULT...genau in dem Moment, wo ich Interrupts einschalte (cpsie i).
>
> Die Interrupts sind nach einem Reset automatisch eingeschaltet. Wenn du
> sie nicht selbst ausschaltest, kann cpsie eigentlich nichts bewirken.
>
> Noch eine doofe Idee: ist der Stackpointer (MSP) kurz vor dem cpsie
> (noch) richtig intialisiert?

OK, hatte übersehen, daß gleich zu Beginn des Programms ein cpsid i 
steht.
Ja. SP zeigt auf gültiges RAM.
Die Register des NVIC sind alle 0:
x/160 0xe000e100
0xe000e100:  0x00000000  0x00000000  0x00000000  0x00000000
0xe000e110:  0x00000000  0x00000000  0x00000000  0x00000000
...
0xe000e350:  0x00000000  0x00000000  0x00000000  0x00000000
0xe000e360:  0x00000000  0x00000000  0x00000000  0x00000000
0xe000e370:  0x00000000  0x00000000  0x00000000  0x00000000
und:
x 0xe000ed04
0xe000ed04:  0x00005000  (SCB_ICSR)
#7073524
Lesenswert?
• ▲
▼
Christoph K. schrieb:
> gleich zu Beginn des Programms ein cpsid i
> Die Register des NVIC sind alle 0:
> 0xe000ed04:  0x00005000  (SCB_ICSR)

...bis auf den BUSFAULT, der hier pending ist. Wenn das der Zustand kurz 
vor dem cpsie ist, kann der BUSFAULT ja irgendwann zwischen dem cpsid am 
Anfang und dem cpsie passiert sein. cpsie erlaubt ihm dann (viel zu 
spät), aktiv zu werden.

Eine Daumenregler: zwischen cpsid und cpsie sollten immer nur eine 
Handvoll Befehle stehen und kein Sprung und kein Unterprogrammaufruf.
OP #7073632
Lesenswert?
• ▲
▼
Bauform B. schrieb:
> Christoph K. schrieb:
>> gleich zu Beginn des Programms ein cpsid i
>> Die Register des NVIC sind alle 0:
>> 0xe000ed04:  0x00005000  (SCB_ICSR)
>
> ...bis auf den BUSFAULT, der hier pending ist. Wenn das der Zustand kurz

Aus dem SCB_ICSR (0x00005000) bits 12-15

> vor dem cpsie ist, kann der BUSFAULT ja irgendwann zwischen dem cpsid am
> Anfang und dem cpsie passiert sein. cpsie erlaubt ihm dann (viel zu
> spät), aktiv zu werden.
>
> Eine Daumenregler: zwischen cpsid und cpsie sollten immer nur eine
> Handvoll Befehle stehen und kein Sprung und kein Unterprogrammaufruf.

Ich kann jetzt nur mal versuchen, den cpsie i vorzuverlegen, um an die 
Stelle des Busfaults heranzukommen. Danke erst mal für die Tipps.
OP #7073715
Lesenswert?
• ▲
▼
Bauform B. schrieb:
> Christoph K. schrieb:
>> Ich kann jetzt nur mal versuchen, den cpsie i vorzuverlegen, um an die
>> Stelle des Busfaults heranzukommen.
>
> Ja, aber? Das ist doch der bessere Plan:
>
> (prx) A. K. schrieb:
>> Siehe BusFault Status Register (BFSR) zur Ursache des BusFault.
>

Dort steht eine 0x04

x/b 0xe000ed29
0xe000ed29:  0x04
(IMPRECISERR)

> Bei manchen Fehlern steht direkt daneben im BFAR die Adresse des
> Fehlers.

Weiß nicht, ob man das sinnvoll nennen kann:

x 0xe000ed38
0xe000ed38:  0xf8

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.