AVR Interrupt Routinen mit C++

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Version vom 7. März 2013, 14:25 Uhr von Goettinger (Diskussion | Beiträge) (Inhaltsverzeichnis und erstes Kapitel erstellt)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Einen Mikrocontroller mit C++ zu programmieren scheitert oft daran die Interrupt Routinen in die Klassenhierarchie zu integrieren. Ohne saubere Objektorientierung verliert C++ jedoch schnell an Wert. Zum Beispiel Frameworks um die Hardware zu abstrahieren sind mit den Interrupt Makros der avr-libc zwar machbar, jedoch mit reinem C++ weit flexibler.

Deshalb soll dieser Artikel einen Einblick in die Möglichkeiten des g++ Compilers geben, der einige Stellschrauben besitzt mit denen sich Interrupts trotz aller Probleme in Klassen, mit Zugriff auf nicht statische Membervariablen, integrieren lassen.

Probleme

name mangeling

In C++ gibt es Namensräume, daher werden für die Symbolnamen nicht nur die Methodennamen benutzt, sondern unter anderem auch die Klassennamen mit eingebracht. Die Schattenseite dieses Features ist allerdings, dass die Interrupt Makros der avr-libc nicht mehr genutzt werden können. ISR(...) ist eines davon, und wird vom Präprozessor über einige weitere Makros nach __vector_n (n = Interruptnummer - 1) aufgelöst.

Zugriff auf nicht statische Membervariablen

Lösungen

das asm Schlüsselwort

befreundete Klassen

Implementierungen

ohne Elternklasse

mit Elternklasse

pragmatischer Ansatz