Forum: Mikrocontroller und Digitale Elektronik Frage zu Interrupts in C++


von heinz (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Devil-Elec (Gast)


Lesenswert?

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.

von heinz (Gast)


Lesenswert?

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
timer timer0(....,TIMER0_OVERFLOW_VECTOR_NUMBER)
3
timer timer1(....,TIMER1_OVERFLOW_VECTOR_NUMBER)

dann wird doch für beide folgende (gleiche?) Implementation aufgerufen 
oder nicht?:
1
void timer::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?

von MitLeserin (Gast)


Lesenswert?

C++
*********************************************************************
https://github.com/KonstantinChizhov/Mcucpp

https://github.com/KonstantinChizhov/Mcucpp/tree/master/mcucpp/AVR ...

...timer0.h .. timer2.h anschauen.

https://github.com/KonstantinChizhov/Mcucpp/tree/master/examples/AvrTimer 
...

... timertest.cpp + includes anschauen

http://www.atmel.com/products/microcontrollers/avr/default.aspx?tab=documents 
...

...atmel avr dokumention anschauen.

C
*********************************************************************
https://www.mikrocontroller.net/forum/mikrocontroller-elektronik ...

...Peter Dannegger's C-code anschauen, braucht immer Timer

*********************************************************************
Beispiele studieren,
Programmiertechnik studieren,
sich Fragen : was?, warum?, wieso?

Das war mein Weg ...

*********************************************************************
Alexandra

von Karl H. (kbuchegg)


Lesenswert?

heinz schrieb:

> aber wenn ich jetzt 2 Timer Objekte folgendermaßen erstelle:
>
>
1
> timer timer0(....,TIMER0_OVERFLOW_VECTOR_NUMBER)
2
> timer timer1(....,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.

von heinz (Gast)


Lesenswert?

> 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 :)

von Karl H. (kbuchegg)


Lesenswert?

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.

von heinz (Gast)


Lesenswert?

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

von MitLeserin (Gast)


Angehängte Dateien:

Lesenswert?

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)

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.