Forum: Mikrocontroller und Digitale Elektronik LPC1768 / IAR / C++ und Interrupts


von Dominik (Gast)


Lesenswert?

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

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

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

von Dominik (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

(...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.

von Dominik (Gast)


Lesenswert?

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

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.