Pergunta

Sei que, ao trabalhar com o MSP430F2619 e o CCSV4 da TI, posso obter mais de uma interrupção para usar o mesmo manipulador de interrupção com código que se parece com o seguinte:

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

ServiceWatchdogTimer();
}

Minha pergunta é que, quando me encontro nessa interrupção, existe uma maneira de descobrir qual dessas interrupções me levou aqui?

Foi útil?

Solução

A resposta geral à sua pergunta não é que não exista um método direto para detectar qual interrupção está sendo chamada atualmente. No entanto, cada interrupção possui seu próprio sinalizador de interrupção para que você possa verificar cada sinalizador na interrupção. Você deve e a bandeira com a ativação de garantir que você esteja lidando com a interrupção que realmente foi chamada. Também com os temporizadores no MSP430, há o Vector Taiv, que pode dizer o que lidar no manipulador A1. O caso 0 do TAIV é que não houve interrupção para o manipulador A1; portanto, para esse caso, você pode assumir que é o manipulador A0.

Eu faria algo como o seguinte.

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

Outras dicas

Não é realmente uma resposta "boa", mas por que não fazer 2 manipuladores de interrupção separados chamam a mesma função?

algo como

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

Olhando para o Guia do usuário da família MSP430x1xx, parece que o dispositivo não mantém um registro de status de interrupção diretamente com essas informações. Você precisará ter dois vetores de interrupções separados para identificar diretamente a diferença ou precisará consultar os dois dispositivos para ver quais necessidades de serviço.

Se você usar 2 vetores de interrupção, eles certamente podem ligar ou pular (se você estiver usando a montagem) para a mesma rotina para executar a maior parte do trabalho como no Resposta dada por Earlz.

Observe que o chip já tem uma tabela de vetor de interrupção, para fazer o que você está falando no comentário que fez em outra resposta, basta apontar as entradas do vetor de interrupção para as interrupções 'não utilizadas' para a rotina que joga um erro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top