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 :)
Wird die startup_stm32f10x_cl.c als C++ kompiliert? Dann wird man die Interruptroutinen evtl. als extern "C" deklarieren müssen.
Oder den Dateiname abändern: "startup_stm32f10x_cl.c" >> "startup_stm32f10x_cl.C"
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 :)
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.
@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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.