Hallo Forum,
folgenden Artikel hier auf mikrocontroller.net finde ich richtig gut:
http://www.mikrocontroller.net/articles/AVR_Interrupt_Routinen_mit_C%2B%2B
Ich habe aber noch eine Frage zur zweiten Variante mit Interrupt
Elternklasse:
Sehe ich es richtig, dass damit für jeden z.B. TimerOverflow-Interrupt
die selber Routine aufgerufen wird? z.B. Timer0, Timer1, Timer2
Oder übersehe ich die Differenzierung irgendwo?
Es gibt zwar eine Differenzierung der Interrupts in der abstrakten
Interrupt-Klasse, aber nur eine Implementierung der serviceRoutine für
die Timerklasse. Dieser übergebe ich zwar die Nummer, aber bei der
serviceRoutine wird nicht nach dieser Nummer unterschieden.
Wenn dem so ist, liese sich das ja mit einer virtuellen Implementierung
von serviceRoutine() umgehen, indem ich für jeden einzelnen Timer die
Timerklasse ableite und dann nur die serviceRoutine implementiere?
Vielen Dank schon mal,
Heinz
heinz schrieb:> Sehe ich es richtig, dass damit für jeden z.B. TimerOverflow-Interrupt> die selber Routine aufgerufen wird? z.B. Timer0, Timer1, Timer2>> Oder übersehe ich die Differenzierung irgendwo?>> Es gibt zwar eine Differenzierung der Interrupts in der abstrakten> Interrupt-Klasse, aber nur eine Implementierung der serviceRoutine für> die Timerklasse.
Nope.
Jedes Timer Objekt hat seine eigene serviceRoutine.
Bei der Erzeugung des Timer Objektes, gibst du an, an welchen Overflow
Interrupt sich dieses Timer Objekt hängen soll.
> Dieser übergebe ich zwar die Nummer, aber bei der> serviceRoutine wird nicht nach dieser Nummer unterschieden.
muss auch nicht.
Die serviceRoutine ist nicht statisch
Hallo,
zum Bsp.
ISR(TIMER0_COMPA_vect) { // Timer 0 Compare.A
...
}
ISR(TIMER1_COMPA_vect) { // Timer 1 Compare.A
...
}
ISR(TIMER1_COMPB_vect) { // Timer 1 Compare.B
...
}
Was es alles an ISR's gibt kannste im Datenblatt zu Deinem Atmel µC
nachlesen. Bei mir Kapitel 14.2 "Reset and Interrupt Vector placement"
Das ist zwar nicht die C Schreibweise, aber man sieht was es alles gibt.
Wird ja dann ähnlich geschrieben.
dann habe ich das Beispiel noch nicht ganz verstanden
> Nope.> Jedes Timer Objekt hat seine eigene serviceRoutine.>> Bei der Erzeugung des Timer Objektes, gibst du an, an welchen Overflow> Interrupt sich dieses Timer Objekt hängen soll.
das ist klar
aber wenn ich jetzt 2 Timer Objekte folgendermaßen erstelle:
1
2
timertimer0(....,TIMER0_OVERFLOW_VECTOR_NUMBER)
3
timertimer1(....,TIMER1_OVERFLOW_VECTOR_NUMBER)
dann wird doch für beide folgende (gleiche?) Implementation aufgerufen
oder nicht?:
1
voidtimer::timerInterrupt::serviceRoutine()
2
{
3
++ownerTimer->i;
4
}
an welcher Stelle sind dann jetzt die unterschiedlichen
Implementierungen für die serviceRoutine für Timer0 und Timer1?
heinz schrieb:> aber wenn ich jetzt 2 Timer Objekte folgendermaßen erstelle:>>
1
>timertimer0(....,TIMER0_OVERFLOW_VECTOR_NUMBER)
2
>timertimer1(....,TIMER1_OVERFLOW_VECTOR_NUMBER)
3
>
>> dann wird doch für beide folgende (gleiche?) Implementation aufgerufen> oder nicht?:
Ach das meinst du.
Ja, das stimmt.
Aber es hindert dich ja nichts daran, dir jeweils eigene
aufgabenspezifische Klassen speziellen für den Anwendungszwecke zu
erstellen und dann deine Timer Objekte davon zu instantiieren.
Edit:
Im übrigen finde ich, das ist genau so ein Punkt an dem eine Verpackung
in Klassen nichts oder nicht viel bringt. Hier ist ein OOP Ansatz
Overkill.
> Aber es hindert dich ja nichts daran, dir jeweils eigene> aufgabenspezifische Klassen speziellen für den Anwendungszwecke zu> erstellen und dann deine Timer Objekte davon zu instantiieren.
Ja genau das war meine Vermutung wie ich es umsetzen muss, aber ich war
mir nicht sicher, ob ich das Beispiel zu 100 % verstanden habe. Habe ich
dann aber doch richtig :)
> Edit:> Im übrigen finde ich, das ist genau so ein Punkt an dem eine Verpackung> in Klassen nichts oder nicht viel bringt. Hier ist ein OOP Ansatz> Overkill.
leider hast du damit Recht, aber ansonsten sehe ich im OOP Ansatz schon
einige Vorteile.
DANKESCHÖN :)
heinz schrieb:>> Edit:>> Im übrigen finde ich, das ist genau so ein Punkt an dem eine Verpackung>> in Klassen nichts oder nicht viel bringt. Hier ist ein OOP Ansatz>> Overkill.>> leider hast du damit Recht, aber ansonsten sehe ich im OOP Ansatz schon> einige Vorteile.
Oh, ich bin ein starker Verfechter von OOP.
Aber es zeigt sich immer wieder, dass es bestimmte Bereiche gibt, an
denen OOP nichts bringt und eigentlich nur eine Menge Overhead erzeugt.
Prominentes Beispiel ist immer dann gegeben, wenn es um SChnittstellen
zu 'externen' Mechanismen geht. Hardware Timer (oder irgendeine andere
Hardware aber auch Files) fallen da rein. An dieser Stelle bricht das
Konzept etwas zusammen und speziell wenn es darum geht die Kurve in der
umgekehrten Richtung zu kratzen (also von extern wieder ins Programm
rein), kommt es dann zu Klimmzügen.
Hast du dir schon mal angesehen, was in C++ ein 'Interface' ist? Im
Grunde ist das eine kleine Klasse, mit lauter virtuellen Funktionen
(meistens sind die auch pure, so dass man sie implementieren muss). Sinn
der Sache ist es, mittels Mehrfachvererbung einer anderen Klasse so ein
'Interface' aufzupfropfen.
> Oh, ich bin ein starker Verfechter von OOP.> Aber es zeigt sich immer wieder, dass es bestimmte Bereiche gibt, an> denen OOP nichts bringt und eigentlich nur eine Menge Overhead erzeugt.> Prominentes Beispiel ist immer dann gegeben, wenn es um SChnittstellen> zu 'externen' Mechanismen geht. Hardware Timer (oder irgendeine andere> Hardware aber auch Files) fallen da rein. An dieser Stelle bricht das> Konzept etwas zusammen und speziell wenn es darum geht die Kurve in der> umgekehrten Richtung zu kratzen (also von extern wieder ins Programm> rein), kommt es dann zu Klimmzügen.>> Hast du dir schon mal angesehen, was in C++ ein 'Interface' ist? Im> Grunde ist das eine kleine Klasse, mit lauter virtuellen Funktionen> (meistens sind die auch pure, so dass man sie implementieren muss). Sinn> der Sache ist es, mittels Mehrfachvererbung einer anderen Klasse so ein> 'Interface' aufzupfropfen.
Ja, Interfaces nutze ich schon, danke für den Hinweis :)
Aber vielleicht könnte ich das ja an dieser Stelle auch noch machen,
muss ich mir mal ein Konzept überlegen.
und ich finde es bringt sehr wohl etwas,
modularen Code !
**************
display in display.h,
Timer in Timer.h mit den ISR's,
Timebase in "public of "Timer,
DCF77 in DCF77.h
(DCF77 nach Beispiel Dannegger)