MSP430 source d'interruption
-
26-09-2019 - |
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?
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.