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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.