Frage

Ich weiß, dass, wenn sie mit dem MSP430F2619 und TI CCSv4 arbeitet, kann ich mehr als einen Interrupt erhält die gleichen Interrupt-Handler mit dem Code zu verwenden, die in etwa so aussieht:

#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){

ServiceWatchdogTimer();
}

Meine Frage ist, wenn ich mich in diesem Interrupt finden, ist es eine Möglichkeit, um herauszufinden, welche eine dieser Unterbrechungen mich hier bekommt?

War es hilfreich?

Lösung

Die allgemeine Antwort auf Ihre Frage nicht ist, gibt es keine direkte Methode zu erkennen, welches Interrupt zur Zeit aufgerufen wird. Jedoch jeder Interrupt hat seinen eigenen Interrupt-Flag, so dass Sie jedes Flag in der Interrupt überprüfen können. Sie sollen und die Flagge mit der Freigabe sicherstellen, dass Sie den Interrupt sind Handling, dass tatsächlich aufgerufen wurde. Auch bei den Timer auf dem MSP430 ist Vektor TAIV, die können Ihnen sagen, was in den A1-Handler zu behandeln. Fall 0 des TAIV ist, dass es keine Unterbrechung für A1-Handler war so für den Fall, dass Sie davon ausgehen, kann er die A0-Handler ist.

würde ich so etwas wie die folgenden tun.

#pragma vector=TIMERA0_VECTOR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
   switch (TAIV)         // Efficient switch-implementation
   {
     case  TAIV_NONE:          // TACCR0             TIMERA0_VECTOR
        break;
     case  TAIV_TACCR1:        // TACCR1             TIMERA1_VECTOR
        break;
     case  TAIV_TACCR2:        // TACCR2             TIMERA1_VECTOR
        break;
     case TBIV_TBIFG:          // Timer_A3 overflow  TIMERA1_VECTOR
        break;
     default;
        break;
   }
   ServiceWatchdogTimer();
}

Andere Tipps

Nicht wirklich eine „gute“ Antwort, aber warum nicht 2 separate Interrupt-Handler die gleiche Funktion aufrufen?

so etwas wie

__interrupt void Timer_A0_handler (void){
  Timer_Handler(0);
}
__interrupt void Timer_A1_handler (void){
  Timer_Handler(1);
}
void Timer_Handler(int which){
  if(which==1){
    ...
  }else{
    ...
  }
  ...
  ServiceWatchdogTimer();
}

Mit Blick auf die MSP430x1xx Familie Benutzerhandbuch , es sieht aus wie das Gerät nicht ein Interrupt-Statusregister mit dieser Information direkt halten. Verringern Sie entweder 2 separate Interrupts Vektoren haben, so dass Sie den Unterschied direkt identifizieren können, oder Sie werden beide Geräte abfragen müssen, um zu sehen, welche gewartet werden muss.

Wenn Sie zwei Interrupt-Vektoren verwenden, können sie sicherlich anrufen oder springen (wenn Sie mit Montage) auf die gleiche Routine den Großteil der Arbeit wie in der Antwort von Earlz gegeben.

Beachten Sie, dass der Chip hat eine eine Interrupt-Vektor-Tabelle bereits, so zu tun, was du redest im Kommentar, den Sie in einer anderen Antwort aus, die Sie gerade die Interrupt-Vektor-Einträge für den ‚nicht verwendet‘ Interrupts zu dem Punkt müssen Routine, die einen Fehler auslöst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top