我正在开发一个系统,其中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循环会导致如此剧烈的时序变化?
答案 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进行优化,因此不应删除循环。