Gast
#461955
Hallo erst mal.
Ist es möglich, den ISR-Code als Memberfunktion einer Klasse anzulegen?
Ziel soll sein, eine Klasse zu haben, die sich exklusiv um bestimmte
Hardware kümmert. Z.B. eine Zähler, gesteuert von externen Interrupts.
Dabei möchte ich in der ISR auf Klassenvariablen zugreifen können.
Der Art nach:
class Cnt {
public:
Cnt(void): count(0) { ...initialisiere Interrupt... }
char get(void) { return count; }
private:
char count;
ISR_INT0_VECT;
}
Cnt::ISR_INT0_VECT {
count++;
}
int main(void) {
Cnt c;
tu_etwas();
PORTB = c.get();
return 0;
}
, so, daß ISR_INT0_VECT in der Vektortabelle eingetragen wird.
Probiert habe ich das ganze bisher mit avr-g++ (GCC) 4.1.2 20061027
(prerelease) wie folgt:
1. ISR_INT0_VECT entsprechend <avr/interrupt.h> mit extern "C" void
INT0_vect... -> c++ meckert, will das nicht in der Klasse haben.
2. ISR_INT0_VECT ohne extern "C" -> name mangling und der Vektor wird
nicht verbogen.
3. ISR_INT0_VECT mit __attribute__((naked)) und die ISR in assembler,
mit
asm (".global __vector_1\n__vector_1:\n"); beginnend funktioniert, ist
aber kein c/c++.
4. ISR_INT0_VECT als friend von Klasse Cnt hat auch nicht gefruchtet.
Geht das überhaupt; wenn ja, wie?
mfg
Marco