4

MSP430F2619 と TI の CCSv4 を使用する場合、次のようなコードで複数の割り込みを取得して、同じ割り込みハンドラーを使用できることを私は知っています。

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

ServiceWatchdogTimer();
}

私の質問は、私がその割り込みにいることに気付いたとき、これらの割り込みのどれが私をここに連れて行ったのかを把握する方法はありますか?

4

3 に答える 3

5

あなたの質問に対する一般的な答えは、現在呼び出されている割り込みを検出する直接的な方法はありません。ただし、各割り込みには独自の割り込みフラグがあるため、割り込みの各フラグを確認できます。実際に呼び出された割り込みを処理していることを確認するために、フラグを有効にする必要があります。また、MSP430 のタイマーには、A1 ハンドラーで何を処理するかを指示できるベクトル TAIV があります。TAIV のケース 0 は、A1 ハンドラーの割り込みがなかったため、A0 ハンドラーであると想定できます。

私は次のようなことをします。

#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();
}
于 2010-04-13T21:16:03.147 に答える
2

MSP430x1xx Family User's Guideを見ると、デバイスは割り込みステータス レジスタをその情報で直接維持していないようです。違いを直接識別できるように 2 つの別々の割り込みベクトルが必要になるか、どちらがサービスを必要としているかを確認するために両方のデバイスにクエリを実行する必要があります。

2 つの割り込みベクトルを使用する場合、Earlz によって与えられた回答のように、同じルーチンを呼び出したりジャンプしたり (アセンブリを使用している場合)、作業の大部分を実行することができます。

チップにはすでに割り込みベクトルテーブルがあることに注意してください。別の回答で行ったコメントで話していることを行うには、「未使用」割り込みの割り込みベクトルエントリを、スローするルーチンにポイントするだけです。エラー。

于 2010-04-13T21:10:31.800 に答える
2

本当に「良い」答えではありませんが、2つの別々の割り込みハンドラが同じ関数を呼び出さないのはなぜですか?

何かのようなもの

__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();
}
于 2010-04-13T20:02:55.330 に答える