www.mikrocontroller.net

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


Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stack nicht korrekt initialisiert?

Autor: XXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast Einsicht in den Assemblercode, wir nicht!


Gruß

Autor: Thomas Burkhart (escamoteur)
Datum:

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

Autor: Wilhelm F. (ferkes-willem)
Datum:

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

Autor: A. K. (prx)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AN A.K,

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

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 }

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anton (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Anton (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal alles

Autor: A. K. (prx)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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:
        _ebss = .;
        *(.stack)
        _estack = .;
d.h. es muss irgenwo ein Array passender Grösse in eine section ".stack" 
gelegt werden.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht 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/List...

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.

Autor: Alfredo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.