3

我正在开发一个 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 毫秒。

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

4

2 回答 2

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,因此不应删除您的循环。

于 2012-09-14T13:23:03.370 回答
1

它不应该有任何区别。

一些调试建议:

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

于 2011-12-31T23:04:23.167 回答