ISR - MSP430 - Switch-Case Anweisung

Gast #2742059
Hallo,

ich habe eine Frage zu der ISR-Behandlung bei den MSP430ern.
Das folgende konstrukt findet sich beispielhaft in mehreren Büchern und 
Examplecodes.


__interrupt void TIMERB1_ISR(void)
{
/* Any access, read or write, of the TBIV register automatically resets 
//the highest "pending" interrupt flag. */

  switch( __even_in_range(TBIV,14) )
  {
    case  0: break;                          // No interrupt
    case  2: break;                          // CCR1 not used
    case  4: break;                          // CCR2 not used
    case  6: break;                          // CCR3 not used
    case  8: break;                          // CCR4 not used
    case 10: break;                          // CCR5 not used
    case 12: break;                          // CCR6 not used
    case 14: P1OUT ^= 0x01;                  // overflow
            break;
    default: break;
  }
}



Was ich mich dabei aber frage:
"Case 0" trifft doch im wesentlichen immer zu, und demnach müsste die 
ISR doch stets sofort verlassen werden, ohne jemals einen der echten 
Interrupt-Cases erreichen zu können...
oder habe ich die switch-case Anweisung nicht richig verstanden?
Gast #2742063
MSP430 schrieb im Beitrag #2742059:
> "Case 0" trifft doch im wesentlichen immer zu
case 0 trifft genau dann zu wenn __even_in_range(TBIV,14) (dessen 
Definition du uns ja verschwiegen hast) Null ist. Ich glaube du hast 
switch-case tatsächlich falsch verstanden.
#2742085
nicht richtig verstanden, ja!
das '__even_in_range' ermöglicht dem compiler hier eine ganz einfache 
sprungtabelle zu bauen. die 14 meint dann, dass der hoechste wert 14 
möglich ist.
im TBIV-reister sind nur die bits 1 bis 3 belegt, und der wert, der 
ausgelesen wird entspricht dann eben 2,4,6,8, ... je nach priorität. 0 
kommt praktisch nicht vor, da sonst keine interrupt ausgelöst werden 
würde.

oder zielt deine frage darauf ab, dass ein 'grösser als'-vergleich im 
case stattfindet? mir klingt das nach irgendeiner komischen sprache, in 
der das so war. basic oder so?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.