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


von Florian M. (micro-flo)


Angehängte Dateien:

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 :)

von Klaus W. (mfgkw)


Lesenswert?

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

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Oder den Dateiname abändern:
"startup_stm32f10x_cl.c" >> "startup_stm32f10x_cl.C"

von Florian M. (micro-flo)


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 :)

von (prx) A. K. (prx)


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.

von Florian M. (micro-flo)


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?

von (prx) A. K. (prx)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.