www.mikrocontroller.net

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


Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.