1

while現在、次のようなMSP430プロセッサ用にCで実装されたループがあります。

register unsigned int sw_loop_count = 0U;
...

while (TACCL0 & CCIE)
{
    ++sw_loop_count;
}

...
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
    // Disable the timer interrupt flag and enable.
    TACCTL0 &= ~CCIFG;
    TACCTL0 &= ~CCIE;
}

私はこのループをキャリブレーションの目的で使用していますが、そのコンテキストは私の質問にはあまり重要ではないと思います。チェックを含むループの各反復にTACCL0 & CCIEは11クロックサイクルかかると計算しました。細分性を高めるために、この数値をできるだけ低くし、可能であればプログラムで取得したいと思います。私は完全なバカかもしれませんが、ループのサイクル数を減らす方法を考えることができないので、アドバイスをいただければ幸いです。sw_loop_count何らかの形で価値が必要です。

4

1 に答える 1

1

うーん、コメントを入れた後、何かできることがあるかもしれないことに気づきました;-)あなたの状態では2つのwhile()値をチェックしています。見た目から、これらの値は両方とも、使用されるたびにメモリから準備ができるように定義する必要があります...volatile

これら2つを1つに減らすことができますか?割り込みハンドラーに必要な比較を行わせ、ループでチェックする単一のフラグを設定します。

または、あなたは本当に空想を得て、そのように別の方法でそれを行うことができます:

// signed and global (or you can pass it's address into your interrupt's routine)
volatile signed int sw_loop_count = 0;

次に、「測定」ループがあります。

while(++sw_loop_count) {}

そしてあなたの割り込みルーチンで:

if(TACCL0 & CCIE)
{
  real_count = sw_loop_count; // save the value for future use before we destroy it
  sw_loop_count = -1; // this will turn into 0 in that while's pre-increment, ending the loop
}

OTOH ...を導入するvolatileと、メモリアクセスから非常に多くのヒットが発生する可能性があるため、実際にはループが遅くなる可能性があります。while()それは実際にはすべて実際のアーキテクチャ(メモリコントローラとキャッシュコントローラの種類に至るまで)に依存しますが、アセンブラモードで実行し、コンパイラが何をしているのかを確認する方がよいと私は主張しています。

于 2012-09-20T18:43:14.870 に答える