Forum: Mikrocontroller und Digitale Elektronik STM32 Rücksprung defekt von IRQ


von Anton (Gast)


Lesenswert?

Hi,

Habe da so ein Problem wo ich ein bischen ratlos bin. Verwende einen 
stm32F105 und die lib 3.3 sowie Code Sourcery light.

Wenn ich in irgendeinen Interruppt will z.B. Can, macht er das auch wie 
er soll. Der Code wird ausgeführt und dann sollte der Rücksprung 
erfolgen.

Da knallts! Er springt mir immer in den Hard fault. Auch wenn kein Code 
in der Routine steht (nur a++; oder so) geht er zwar ordendlich rein, 
aler nicht wieder raus.
Es ist schwer zu prüfen da ich nicht sehe woher er genau kommt. Einsicht 
in den Assembler Code habe ich. Hat einer eine Idee?

von (prx) A. K. (prx)


Lesenswert?

Anton schrieb:

> Hat einer eine Idee?

Ja, du machst was falsch.

Angefangen mit dem Beitrag, denn wer soll dir anhand dieser komplett 
nicht vorhanden Information helfen können?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Stack nicht korrekt initialisiert?

von XXX (Gast)


Lesenswert?

Du hast Einsicht in den Assemblercode, wir nicht!


Gruß

von Thomas B. (escamoteur)


Lesenswert?

Wahrscheinlich korrupter Stack. Schreibst Du irgendwo über ein Array 
hinaus oder ähnliches?
Gruß
Tom

von Wilhelm F. (Gast)


Lesenswert?

Sowas ähnliches gab es doch in den letzten Tagen schon mal hier. Ein 
User hatte die Interruptfunktion nicht als Interrupt deklariert...

von (prx) A. K. (prx)


Lesenswert?

Beim STM32 wär's eher fatal, wenn er sie als Interrupt deklariert. Bei 
den Cortex-M3 sind Handler normale C Funktionen.

von (prx) A. K. (prx)


Lesenswert?

Anton schrieb:

> Da knallts! Er springt mir immer in den Hard fault. Auch wenn kein Code
> in der Routine steht (nur a++; oder so) geht er zwar ordendlich rein,
> aler nicht wieder raus.

Von AVRs verwöhnt? Bei den STM32 ist es nicht üblich, dass sich 
Interrupts von selbst zurücksetzen sobald der Handler aufgerufen wird. 
Muss man schon selbst Hand anlegen.

von Anton (Gast)


Lesenswert?

UI, so viele Ohrfeigen auf ein mal.

Aber der Code steht fest, ich sagte lib 3.3. Habe das Beispiel für CAN 
1.1 kopiert und aufgespielt, voher meine Prozessor eingestellt und 
geplänkel programmiert. Nichts besonderes.

Mit dem Einblick in den Assembler Code meinte ich das ich einige Sachen 
überprüfen könnte wenn ich wüste wonach ich schauen soll.

Das der Stack etwas damit zu tun hat ist mir klar, auch wie er allgemein 
funktioniert, aber wie genau bei Cortex, und wo kann ich mich auf die 
Fehlersuche begeben, das ist ja der Grund warum ich hier schreibe.

Den Code in den Anhang zu stellen bringt glaube ich nicht viel.

von Anton (Gast)


Lesenswert?

AN A.K,

Zum Zurücksetzen komme ich ja nicht, auch wird die Routine nur einmal 
aufgerufen, dann Hard Fault.

von Anton (Gast)


Lesenswert?

So stehts drin:


00146 
/*********************************************************************** 
*******/
00147 /*            STM32F10x Peripherals Interrupt Handlers 
*/
00148 
/*********************************************************************** 
*******/
00149
00150
00151 /**
00152   * @brief  This function handles CAN1 Handler.
00153   * @param  None
00154   * @retval None
00155   */
00156 #ifndef STM32F10X_CL
00157 void USB_LP_CAN1_RX0_IRQHandler(void)
00158 #else
00159 void CAN1_RX0_IRQHandler(void)
00160 #endif
00161 {
00162   CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
00163   if ((RxMessage.StdId == 0x321)&&(RxMessage.IDE == 
CAN_ID_STD)&&(RxMessage.DLC == 1))
00164   {
00165     LED_Display(RxMessage.Data[0]);
00166     Key_Pressed_Number = RxMessage.Data[0];
00167   }
00168 }

von (prx) A. K. (prx)


Lesenswert?

Anton schrieb:

> Zum Zurücksetzen komme ich ja nicht, auch wird die Routine nur einmal
> aufgerufen, dann Hard Fault.

Du schreibst, dass er in den Handler rein, aber nicht wieder sauber 
rauskommt. Interrupt zurücksetzen tut man im Handler. Was ein Handler 
komplett ohne Code nicht tut. Darauf bezog ich mich.

von (prx) A. K. (prx)


Lesenswert?

Anton schrieb:

> Den Code in den Anhang zu stellen bringt glaube ich nicht viel.

Wenn es der Sample-Code ist, dann nicht. Allerdings hattest du das 
anfangs nicht erwähnt und so konnte das ja auch niemand wissen.

Du wirst mal nachforschen müssen wie der Stack definiert wird. Das ist 
meist Sache des noch unbekannt gebliebenen Startup-Codes und des 
Linker-Scripts. Ich habe nicht parat, ob CS da was mitliefert oder das 
in der FwLib bzw. dem CSMIS mitschwimmt oder ob du es anderweitig 
organisiert hast.

von Anton (Gast)


Angehängte Dateien:

Lesenswert?

Mir geht es ja um diesen blöden Stack. wo find ich diesen Schw....hund. 
Mein Linker script ist dieses hier. und der Startup Code der.
Im Moment befinde ich mich auf dem STM3210E-Eval Board.
Irgendwie sag ich mir aber das dieser dem Compiler sagt wie er in die 
IRQ reinkommt, aber raus ist doch eigentlich seine Sache.

von Anton (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal alles

von (prx) A. K. (prx)


Lesenswert?

Nebenbei: RxMessage und key_pressed werden im Handler geschrieben, sind 
aber nicht volatile.

von (prx) A. K. (prx)


Lesenswert?

Dein Stack hat die Grösse 0. Dessen oberes Ende ist _estack, dessen 
unteres Ende _ebss. Direkt davor steht der CAN RxBuffer.

Jedenfalls definiert dies den Stack:
1
        _ebss = .;
2
        *(.stack)
3
        _estack = .;
d.h. es muss irgenwo ein Array passender Grösse in eine section ".stack" 
gelegt werden.

von 900ss (900ss)


Lesenswert?

Für die Cortex kannst du wunderbar fault handler schreiben. Der Cortex 
speichert eine ganze Menge Informationen in dafür vorgesehene Register.
Folge mal dem Link, dort beschreibt der Autor des Buches "The Definitive 
Guide to the ARM Cortex-M3", wie man an die Infos kommt. Das Buch ist 
meiner Meinung nach auch zu empfehlen. 2. Posting lesen.
https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/Hard%20Fault%20and%20stack%20pushing

Ich meine wenn die Stackgröße 0 Byte lang ist, dann kannst du dir das 
sparen ;-) Aber der Link ist vielleicht allgemein für andere auch 
hilfreich.

von Alfredo (Gast)


Lesenswert?

wie kann ich den stack den anders definieren, zwar wird er bei diesem 
Programm nicht viel brauchen, aber irgendwo muss es ja dran liegen.

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.