Interrupt-Routine beenden

Gast #3916971
Lesenswert?

Hallo Forum, ich habe da eine (Timer)-Interruptroutine die nach 
Möglichkeit schnell abgearbeitet werden soll.
In der Routine sind eine Reihe if-Abfragen,
1
   if(Tasten == 0x02){ // Code für Tasten 0x02
2

3
   }
4
   if(Tasten == 0x06){ // Code für Tasten 0x06
5

6
   }
7
   if(Tasten == 0x04){ // Code für Tasten 0x04
8

9
   }
10
   if(Tasten == 0x00){ // Code für Tasten 0x00
11

12
   }
13
   // usw.

wenn eine davon zutrifft soll der dazu gehörende Code abgearbeitet 
werden und die Interrupt-Routine sofort  beendet werden.
Klar, ich könnte das mit switch case break machen.
Aber gibt es noch eine andere Möglichkeit, die Interupt Routine sauber 
zu beenden ohne die anderen if-Abfragen zu durchlaufen?
Was nehme ich da am besten?
Moderator Persönliche Seite #3916997
Lesenswert?

Markus F. schrieb:
> ... was hast Du gegen ein switch()-Statement?

Das ist neben Olivers Einwurf die zweite sinnvolle Möglichkeit.

Es muss einem doch direkt ins Auge stechen, dass
1
   if (taste == 1)
2
   if (taste == 2)
3
   if (taste == 3)
4
   if (taste == 4)
5
   if (taste == 5)

viel däml^H^H^H^H ineffizienter ist als ein
1
   if (taste == 1)
2
   else if (taste == 2)
3
   else if (taste == 3)
4
   else if (taste == 4)
5
   else if (taste == 5)

... wo direkt nach dem ersten Match keine weiteren Abfragen mehr 
vorgenommen werden.

Dasselbe gilt für die switch-Alternative.
#3917052
Lesenswert?

Peter Zz schrieb:
> Markus F. schrieb:
>> ... was hast Du eigentlich gegen ein switch()-Statement?
>
> Du hast ja recht,
> ich sollte das in der Tat mit einem switch case break machen!

Das ist auch wieder so eine 'Regel'.

Ob ein switch-case besser ist, oder einfach ein paar if else-if hängt 
nicht zuletzt auch von den Abfragebedingungen bzw. den dort vorkommenden 
konkreten Werten ab.
Persönliche Seite #3917299
Lesenswert?

Frank M. schrieb:
> Es muss einem doch direkt ins Auge stechen, dass
>
1
    if (taste == 1)
2
>    if (taste == 2)
3
>    if (taste == 3)
4
>    if (taste == 4)
5
>    if (taste == 5)
>
> viel däml^H^H^H^H ineffizienter ist als ein
>
1
    if (taste == 1)
2
>    else if (taste == 2)
3
>    else if (taste == 3)
4
>    else if (taste == 4)
5
>    else if (taste == 5)
>
> ... wo direkt nach dem ersten Match keine weiteren Abfragen mehr
> vorgenommen werden.

Falls taste nicht verändert wird macht das keinen Unterschied. 
Ausprobieren!

> Dasselbe gilt für die switch-Alternative.

Die wird i.d.r anders (effizienter) übersetzt.
#3917390
Lesenswert?

m.n. schrieb:
> Johann L. schrieb:
>>> Dasselbe gilt für die switch-Alternative.
>>
>> Die wird i.d.r anders (effizienter) übersetzt.
>
> Wobei das aber auch bedeutet, die Reihenfolge kann beliebig verändert
> werden. Mit einem 'if' gibt man die Priorität der Vergleiche selber vor.

Bei einem "ausreichend großen" switch gibt's keine Priorität mehr (bzw. 
sie ist für jeden Wert gleich). Der Compiler macht dann eine 
Sprungtabelle draus. Wenn man unbedingt will, kann man die per 
Funktionspointer auch in C zimmern. Bei meinem ersten großen C-Projekt 
(vor 25 Jahren) hat das - gegenüber einem großen switch-Statement) mal 
ca. 30% Laufzeitverbesserung gebracht.
Moderne Compiler sollten das heutzutage - ohne daß man ihnen "auf die 
Sprünge" helfen muß - besser können.
#3917508
Lesenswert?

Markus F. schrieb:
> Bei einem "ausreichend großen" switch gibt's keine Priorität mehr (bzw.
> sie ist für jeden Wert gleich).

Nur wenn die Werte ohne grössere Löcher liegen.

> Moderne Compiler sollten das heutzutage - ohne daß man ihnen "auf die
> Sprünge" helfen muß - besser können.

Es gibt diverse Varianten, switch Statements umzusetzen, und dazu wird 
anhand Anzahl und Verteilung der Werte abgeschätzt, welche besser ist. 
Dazu gehört auch eine Variante, die kein Programmierer zu Fuss 
hinbekommt, nämlich ein Baum aus Vergleichen. So arbeitete schon manch 
schwach optimierender Compiler vor 30 Jahren. Allerdings kann diese 
Abschätzung auch mal schief liegen. Damals wie heute.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren