ISR - MSP430 - Switch-Case Anweisung

Gast #2742059
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

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