【发布时间】:2011-12-31 21:43:47
【问题描述】:
我正在开发一个系统,其中 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 毫秒。
似乎尽可能快地读取 P1IN,如果没有内部 for 循环,会导致 P1IN 无法尽快更新。这有道理吗?添加/删除内部 for 循环会导致如此剧烈的时间变化是否有明确的原因?
【问题讨论】:
-
查看 asm,确认内部循环没有被优化。还要验证 while 行是否正在执行您希望它执行的操作。请注意,在循环之后重新读取 P1IN 不会在 while 行看到的状态下看到 0x40 位。如果您正在优化内部循环,那么内部循环就会消失,如果不进行优化,那可能就是您看不到输入状态变化的原因。
-
我确实检查了 asm 并且内部循环没有被优化出来。 “请注意,在循环之后重新读取 P1IN 不会在 while 行看到的状态下看到 0x40 位”-您能否进一步解释该语句,我认为我没有遵循。需要注意的一点是,无论有无 for 循环,P1IN 最终都会改变状态。它最终会起作用,只是没有 for 循环似乎需要更长的时间。
-
另外,感谢您的回复和建议
-
如果您在 while 循环中读取 P1IN,这是一个示例,如果您希望能够在循环后稍后读取 P1IN 并期望相同的值(也许调试您看到的问题)那是位的单独采样并且可以是单独的状态。如果您想保留 while 循环中的样本,请将其分配给某些东西 while(1) { x=P1IN; if(x&0x40==0) 中断; } 用 x&0x40 做一些事情
-
这与您需要内部循环的问题无关,但 PORT1 能够在从高到低转换时触发中断。所以配置中断后你可以清零标志,然后在P1IFG & 0x40为真时中断循环。