mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 mit C++ stürzt bei Interrupt ab


Autor: Florian Micro (micro-flo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
Nachdem ich mein C Programm nun auf C++ umgestellt habe, gibt es ein 
Problem mit den Interrupts.
Sobald ein Interrupt kommen sollte, landet er im "Default_Handler" und 
hängt dort.
Der Interrupt-Handler ist korrekt definiert und unter C lief alles.

Im Anhang mein Linkerskript, startfile und makefile.

Das Linkerskript ist gleich wie beim C Programm.

Das startfile ist gleich wie bei C bis auf "__libc_init_array();".
Aber egal ob die Zeile drin ist oder nicht, es klappt nicht.

Beim makefile ist einiges geändert im Gegensatz zu C. Aber auch wenn ich 
das makefile von C nehme, klappt es nicht.

Ich habe schon einiges probiert mit dem makefile und startfile, aber 
nichts hilft.
Auch egal ob die Vektoren im Ram oder Flash sind und das Programm aus 
dem Ram oder Flash ausgeführt wird, es stürzt immer ab, wenn ein 
Interrupt kommt.
Ohne Interrupts läuft das Programm problemlos.

Ich verstehe die drei Dateien nur rudimentär. Ich hatte sie damals an 
die Connectivity Line und 32k Ram angepasst.
Vielleicht ist ein dummer Fehler drin, den ein Profi sofort sieht.

Ich hoffe, dass ihr mir helfen könnt :)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird die startup_stm32f10x_cl.c als C++ kompiliert?
Dann wird man die Interruptroutinen evtl. als extern "C"
deklarieren müssen.

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder den Dateiname abändern:
"startup_stm32f10x_cl.c" >> "startup_stm32f10x_cl.C"

Autor: Florian Micro (micro-flo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Mir hat sich zwar der Sinn für die beiden Ansätze nicht erschlossen, 
aber ich habe es trotzdem probiert.
extern "C" ist doch nur für .h Dateien?

Funktioniert hat leider nichts. Er stürzt immer noch ab.

Ich habe das startfile auch mal als C++ kompiliert. Dann geht auch der 
Debugger nicht mehr, sondern springt an eine unbekannte Code-Stelle.
Hat vielleicht jemand ein C++ Projekt mit Interrupts, das läuft?

Danke :)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian Micro schrieb:

> extern "C" ist doch nur für .h Dateien?

Es stellt sicher, dass die darin deklarierten oder definierten 
Funktionen entsprechend der C Regeln für Funktionsaufrufe und interner 
Namensgebung behandelt werden. Das kann bei Interrupt-Handlern recht 
wesentlich ein. C++ Funktionen heissen auf Assembler/Linker Ebene anders 
als auf C++ Ebene.

Den Startup-Code als C++ Code zu übersetzen kann nur funktionieren, wenn 
keinerlei Assembler Startup-Code vorhanden ist (nicht selten ist das 
jedoch ein Mix aus Assembler und C). Sicherer ist es jedenfalls, den 
Startup-Code unverändert als C-Code zu übersetzen und sämtliche 
Funktionen, die im Startup verwendet aber nicht dort definiert sind 
ebenfalls. Wobei man dann  insbesondere sämltiche eigenenen 
Interrupt/Exception-Handler als C Funktionen deklarieren muss - das kann 
aber auch auf Initialisierungs-Hooks zutreffen.

Autor: Florian Micro (micro-flo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Klaus Wachtler & A. K.
Ihr hatte beide recht!
Ich hatte das extern "C" bisher nur in .h Dateien gesehen.
Nun stehts vor jedem Interrupt_Handler und die Kiste läuft!
Ich wusste doch, dass die Profis da gleich sehen, was schiefläuft ;)

Vielen Dank!

Dann noch eins zum Verständnis: die main muss nicht als extern "C" 
deklariert werden (obwohl sie in einer cpp Datei ist), weil sie vom C 
Code im startfile aufgerufen wird?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian Micro schrieb:

> Dann noch eins zum Verständnis: die main muss nicht als extern "C"
> deklariert werden (obwohl sie in einer cpp Datei ist), weil sie vom C
> Code im startfile aufgerufen wird?

Sie muss nur deshalb nicht als "C" deklariert werden, weil der Compiler 
pfiffig genug ist, diese Besonderheit auch ohne eigene Aufforderung zu 
kennen.

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.