STM32 Rücksprung defekt von IRQ

Gast #1807227
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?
Gast #1807275
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.
Gast #1807279
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 }
#1807355
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.
Gast #1811458
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.
Angehängte Dateien:
#1812119
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.
#1812162
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.

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