我正在研究MSP430通过其SPI总线与另一个芯片进行通信的系统。我正在通过SPI总线发送一系列设置命令,并在从设备芯片的Ready线路上轮询。我使用IAR作为我的IDE,我正在编译代码时没有任何优化。该代码看起来像这样:太快读取MSP430 IO寄存器?
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
}
有和没有空内循环,此代码工作正常。所有的设置信息都通过SPI总线正确传输。没有内循环,这个代码块需要大约10秒。使用inner for循环,该代码块需要大约100 ms。
看起来像读取P1IN尽可能快,没有内循环,导致P1IN不会更新得快。这有意义吗?是否有明确的理由,增加/删除内循环会导致如此剧烈的时间变化?
看看asm,验证innner循环没有被优化出来。同时验证while线正在做你想做的事。请注意,循环后重新读取P1IN不会在while行看到的状态下看到0x40位。如果你正在优化内部循环消失,如果没有优化,这可能是你没有看到输入状态改变的原因。 – 2012-01-01 00:32:45
我没有检查asm,内循环没有被优化。 “请注意,在循环之后重新读取P1IN,预计不会看到0x40位的状态,即while行看到” - 您能否进一步解释该声明,我不认为我遵循。有一点需要注意的是,在没有for循环的情况下,P1IN最终会改变状态。它最终会工作,没有for循环似乎需要更长的时间。 – 2012-01-01 01:17:02
另外,如果您在while循环中读取P1IN,那么感谢您的回复和建议 – 2012-01-01 01:27:27