读MSP430 IO寄存器太快了?

时间:2011-12-31 21:43:47

标签: c embedded msp430

我正在开发一个系统,其中MSP430通过其SPI总线与另一个芯片通信。我正在通过SPI总线发送一系列设置命令,并在从芯片的就绪线上进行轮询。我正在使用IAR作为我的IDE,而我正在编译代码而没有任何优化。代码看起来像这样:

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 ms。

似乎尽可能快地读取P1IN,没有内部for循环,导致P1IN无法快速更新。这有意义吗?是否有明确的理由说,添加/删除内部for循环会导致如此剧烈的时序变化?

2 个答案:

答案 0 :(得分:1)

它应该没有任何区别。

一些调试建议:

我建议将内循环的迭代减少到零,看看是否会改变系统时序。同时尝试将内循环换成nop,看看是否有相同的效果。您还可以查看生成的程序集,看看两个编译之间是否有任何明显的结果。最后,(如果可以的话)确定SPI线的范围,看看两者之间的行为是否存在差异。

答案 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
}

这里的关键是“volatile”关键字,禁止编译器对变量j进行优化,因此不应删除循环。