STM32 mit C++ stürzt bei Interrupt ab

OP #1929805
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 :)
Angehängte Dateien:
OP #1930255
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 :)
#1930275
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.
OP #1930304
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?

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.