Question

Je sais que lorsque l'on travaille avec le MSP430F2619 et CCSv4 de TI, je peux obtenir plus d'une interruption d'utiliser le même gestionnaire d'interruption avec le code qui ressemble à ceci:

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

ServiceWatchdogTimer();
}

Ma question est, quand je me trouve dans cette interruption, est-il un moyen de savoir laquelle de ces interruptions me suis arrivé ici?

Était-ce utile?

La solution

La réponse générale à votre question est non il n'y a pas de méthode directe pour détecter qui interruption est actuellement appelé. Toutefois, chaque interruption a son propre drapeau d'interruption afin que vous puissiez vérifier chaque drapeau dans l'interruption. Vous devriez et le drapeau avec l'permettent de vous assurer que vous manipulez l'interruption qui a été effectivement appelé. Aussi avec les minuteries sur le MSP430 il y a vecteur TAIV qui peut vous dire quoi gérer dans le gestionnaire A1. Cas 0 du TAIV est qu'il n'y avait pas d'interruption pour gestionnaire A1 donc pour ce cas, vous pouvez supposer qu'il est le gestionnaire A0.

je ferais quelque chose comme ce qui suit.

#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();
}

Autres conseils

Pas vraiment une « bonne » réponse, mais pourquoi ne pas faire 2 gestionnaires d'interruption séparés appellent la même fonction?

quelque chose comme

__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();
}

Regarder le Guide de l' MSP430x1xx Famille utilisateur , il ressemble le dispositif ne tient pas de registre d'état d'interruption avec cette information directement. Vous aurez soit besoin d'avoir 2 vecteurs séparés Interruptions de sorte que vous pouvez identifier la différence directement, ou vous aurez besoin d'interroger les deux appareils pour voir ce qui a besoin d'un service.

Si vous utilisez 2 vecteurs d'interruption, ils peuvent certainement appeler ou sauter (si vous utilisez l'assemblage) à la même routine pour effectuer la majeure partie du travail comme dans le réponse donnée par Earlz .

Notez que la puce a une une table de vecteur d'interruption déjà, à faire ce que vous parlez dans le commentaire que vous avez fait dans une autre réponse, il vous suffit de pointer les entrées de vecteur d'interruption pour les interruptions « inutilisées » au routine qui renvoie une erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top