Domanda

So che quando si lavora con il MSP430F2619 e TI CCSv4, posso avere più di un interrupt di utilizzare lo stesso gestore di interrupt con il codice che sembra qualcosa di simile a questo:

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

ServiceWatchdogTimer();
}

La mia domanda è, quando mi trovo in quel di interrupt, c'è un modo per capire che uno di questi interrupt mi ha fatto qui?

È stato utile?

Soluzione

La risposta alla tua domanda è no, non esiste un metodo diretto per rilevare che l'interrupt è attualmente in fase di chiamata.Tuttavia ogni interrupt ha il suo interrupt flag in modo da poter controllare ogni flag di interrupt.Si dovrebbe e la bandiera con l'abilitazione per assicurarsi che si gestisce l'interrupt che in realtà è stato chiamato.Anche con il timer su MSP430 c'è vettoriale TAIV che posso dire è che per gestire in A1 gestore.Caso 0 del TAIV è che non c'è stata alcuna interruzione, A1 gestore, in modo che per caso si può supporre che è A0 gestore.

Vorrei fare qualcosa di simile.

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

Altri suggerimenti

Non è davvero una "buona" risposta, ma perché non fare 2 separate gestori di interrupt chiamare la stessa funzione?

qualcosa di simile

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

Guardando il MSP430x1xx Famiglia Guida dell'Utente, sembra che il dispositivo non mantenere un registro di stato di interrupt con le informazioni direttamente.È necessario avere 2 diversi vettori d'interrupt in modo da poter identificare la differenza, o avrai bisogno di query entrambi i dispositivi per vedere che esigenze di servizio.

Se si usano 2 vettori di interrupt, si può certamente chiamare o passare (se si utilizza un assembly) per la stessa routine per eseguire la maggior parte del lavoro, come nel risposta data da Earlz.

Nota che il chip ha un interrupt vector table già, in modo da fare di cosa si sta parlando nel commento che hai fatto in un'altra risposta, basta puntare il vettore di interrupt non valide per il 'inutilizzati' interrupt routine che genera un errore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top