3

私は、MSP430がSPIバスを介して別のチップと通信しているシステムに取り組んでいます。SPIバスを介して一連のセットアップコマンドを送信し、スレーブチップのReadyラインでポーリングしています。IDEとしてIARを使用しており、最適化せずにコードをコンパイルしています。コードは次のようになります。

for(int i = 0; i < NUM_SETUP_COMMANDS; i++)
{
    SendSetupCommand(); //puts data in SPI Tx buffer, sets Chip select low

    while(P1IN & 0x40) //wait for Chip ready line to go low
    {
        for(int x; x < 1024; x++)
        { 
            //do nothing 
        }
    }

    HandleReadyLine(); //Transmit/Receive data on SPI bus
 }

空の内部forループがある場合とない場合で、このコードは正しく機能します。すべてのセットアップメッセージは、SPIバスを介して正しく送信されます。内部のforループがない場合、このコードブロックには約10秒かかります。内部のforループを使用すると、このコードブロックには約100ミリ秒かかります。

内部のforループなしで、P1INをできるだけ速く読み取ると、P1INがそれほど速く更新されないように見えます。これは意味がありますか?内側のforループを追加/削除すると、このような大幅なタイミング変更が発生する明確な理由はありますか?

4

2 に答える 2

1

違いはありません。

いくつかのデバッグの提案:

内部ループの反復をゼロに減らして、システムのタイミングが変わるかどうかを確認することをお勧めします。また、内側のループをnopと交換して、同じ効果があるかどうかを確認してください。また、生成されたアセンブリを調べて、2つのコンパイルの間に明らかなものがあるかどうかを確認することもできます。最後に、(可能であれば)SPIラインのスコープを設定し、2つの動作に違いがあるかどうかを確認します。

于 2011-12-31T23:04:23.167 に答える
1

ループはおそらく最適化されています。最適化されていないことを確認する1つの方法は、次のようなダミー計算を実行することです。

for(int i = 0; i < NUM_SETUP_COMMANDS; i++)
{
    SendSetupCommand(); //puts data in SPI Tx buffer, sets Chip select low

    while(P1IN & 0x40) //wait for Chip ready line to go low
    {
        volatile unsigned int i;
        for(int x; x < 1024; x++)
        { 
            j++; 
        }
    }
    HandleReadyLine(); //Transmit/Receive data on SPI bus
}

ここで重要なのは、コンパイラによる変数jの最適化を禁止する「volatile」キーワードです。したがって、ループを削除しないでください。

于 2012-09-14T13:23:03.370 に答える