Hi zusammen, ich habe das LPC1768 KickStart Kit von IAR und versuche gerade in C++ eigene Interruptroutinen zu schreiben. Die Datei cstartup_M.c habe ich so definiert, dass alle INT-Routinen __weak sind. Wenn ich jetzt unter "C" eine Interrupt-Routine schreibe, die in der cstartup_M.c als __weak definiert ist, wird meine neue Routine genutzt. Wenn ich das ganze unter "C++" versuche, dann geht leider garnix. D.h. die leere Platzhalter-Routine aus der cstartup_M.c wird verwendet. Wenn ich den Interrupt in eine eigene Klasse packe geht es auch nicht. Das sieht man auch schön im Linker-Logfile. Anscheinend macht der was nicht ganz richtig. Hat jemand vielleicht eine Idee, an was das liegen kann? Danke Dominik
Hi du musst deine C++ ISR extern "C" deklarieren sonst wird das Symbol "gemangelt" und der Name passt nicht mehr zum als "weak" deklarierten Symbol. Also etwa so: extern "C" void myISRName(void) { someCode(); } Matthias
Super. Danke, das funktioniert. Kannst du (oder jemand anderes) mir vielleicht auch sagen, Klassenmethoden als IRQs nutzen kann? Das funktioniert bei mir mit extern "C" nicht... Danke nochmal! Dominik
(...habe keine Ahnung von LPC1768...) Dazu müssen die auch sicher static sein in der Klasse. Damit ist verbunden, daß sie auf nichts zugreifen, was zu einem Objekt gehört, sondern nur auf static-Elemente der Klasse und entsprechend auch nur static-Methoden wiederum aufrufen. Schließlich hat man in der ISR ja kein Objekt. Falls das nicht reicht: eine Wrapper-Funktion außerhalb der Klasse schreiben, die dann die statische Methode aufruft.
Danke! Mit Wrapper funktionierts, ohne allerdings nicht (static hatte ich schon). Auf die Idee hätte ich auch selbst kommen können :) Vielleicht kennt doch noch jemand eine Möglichkeit es ohne Wrapper zu machen? Irgendwie ist das unschön... ;) Ciao Dominik
Hi das kann, so wie du deine Umgebung beschreibst, nicht funktionieren da eine Klassenmethode an ihrem Namen immer auch den Klassennamen in irgendeiner Form "drankleben" hat. Sonst könnte sie der Linker nicht der Klasse zuordnen. Du müsstest also bei der Definition der Interruptvektoren den passenden Namen eintragen. Obs das aber Wert ist? Matthias
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.