0

MSP430 で高度なコンパイラー最適化を使用してタイマー A を使用しましたが、高度なコンパイラー最適化を使用するとタイマー コードが失敗することがわかりました。最適化を使用しない場合、コードは正常に動作します。

このコードは、1 ミリ秒のタイマー ティックを達成するために使用されます。timeOutCNT は割り込みでインクリメントされます。

以下はコードです

   //Disable interrupt and clear CCR0
   TIMER_A_TACTL = TIMER_A_TASSEL |                       // set the clock source as SMCLK
    TIMER_A_ID |                           // set the divider to 8
    TACLR |                                // clear the timer
    MC_1;      // continuous mode
   TIMER_A_TACTL &= ~TIMER_A_TAIE;                        // timer interrupt disabled
   TIMER_A_TACTL &= 0;                        // timer interrupt flag disabled

   CCTL0 = CCIE;                               // CCR0 interrupt enabled
   CCR0 = 500;
   TIMER_A_TACTL &= TIMER_A_TAIE;    //enable timer interrupt
   TIMER_A_TACTL &= TIMER_A_TAIFG;    //enable timer interrupt
   TACTL = TIMER_A_TASSEL + MC_1 + ID_3;                   // SMCLK, upmode

   timeOutCNT = 0;

   //timeOutCNT is increased in timer interrupt
   while(timeOutCNT <= 1); //delay of 1 milisecond 

   TIMER_A_TACTL = TIMER_A_TASSEL |                       // set the clock source as SMCLK
   TIMER_A_ID |                             // set the divider to 8
   TACLR |                                  // clear the timer
   MC_1;        // continuous mode
   TIMER_A_TACTL &= ~TIMER_A_TAIE;                        // timer interrupt disabled
   TIMER_A_TACTL &= 0x00;                        // timer interrupt flag disabled

この問題を解決するためにここで私を助けてくれる人はいますか? 最適化モードで正常に動作するように、タイマー A を使用できる他の方法はありますか? それとも、1ミリ秒の割り込みを達成するために間違って使用していますか?

4

3 に答える 3

1

リスト ファイルの出力を見て、アセンブラの出力に次の行の出力が含まれているかどうかを確認します。

while(timeOutCNT <= 1);

コンパイラのキックスタート バージョンを使用している場合、リスト ファイルにはアセンブラのリストが含まれていないため、コードを C-Spy にロードして、そこで逆アセンブラのリストを確認する必要があります。

として宣言していないという点で、Hasturkunは正しい方向に進んでいると思います。これを忘れると、オプティマイザは while ステートメントが次のようになると想定します。timeOutCNTvolatile

while (1) ;

于 2010-06-14T15:00:34.957 に答える
1

TIMER_A_TACTLありますvolatileか?そうでない場合、コンパイラは、読み取りと書き込みに副作用がないと仮定して、それらを並べ替えたり組み合わせたりすることがあります。

適切な位置にバリアを導入するか、これらの変数を次のように宣言することで解決できるはずです。volatile

于 2010-06-14T14:44:30.763 に答える
0

タイマー コードについて具体的にコメントすることはできませんが、一般的に同様の問題が見られました。高レベルの最適化が使用された場合、一見無関係な方法でコードがさまざまな場所で壊れていました。最終的には、コンパイラのバグが原因であると判断し、最適化を完全に無効にしました。

于 2010-06-14T14:30:46.620 に答える