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

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