2011-12-31 61 views
3

我正在研究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不会更新得快。这有意义吗?是否有明确的理由,增加/删除内循环会导致如此剧烈的时间变化?

+2

看看asm,验证innner循环没有被优化出来。同时验证while线正在做你想做的事。请注意,循环后重新读取P1IN不会在while行看到的状态下看到0x40位。如果你正在优化内部循环消失,如果没有优化,这可能是你没有看到输入状态改变的原因。 – 2012-01-01 00:32:45

+0

我没有检查asm,内循环没有被优化。 “请注意,在循环之后重新读取P1IN,预计不会看到0x40位的状态,即while行看到” - 您能否进一步解释该声明,我不认为我遵循。有一点需要注意的是,在没有for循环的情况下,P1IN最终会改变状态。它最终会工作,没有for循环似乎需要更长的时间。 – 2012-01-01 01:17:02

+0

另外,如果您在while循环中读取P1IN,那么感谢您的回复和建议 – 2012-01-01 01:27:27

回答

1

它应该没有任何区别。

一些调试建议:

我会建议减少内循环迭代为零,看看是否能更改系统时间。也尝试交换一个nop的内部循环,看看是否有相同的效果。你也可以看看生成的程序集,看看这两个汇编之间是否有明显的区别。最后,(如果可以的话)确定SPI线的范围,看看两者之间是否有任何不同。

+0

我曾尝试改变内部循环的迭代。我发现如果for循环的运行次数少于650次,那么它就会像for循环不存在一样。 我还没有尝试过使用nop。我会接下来尝试。 不幸的是,我没有访问SPI线路。我只能访问几个GPIO测试点。 – 2012-01-01 01:13:04

+0

感谢您的调试建议。 – 2012-01-01 01:26:03

+0

想法#1 - 如果在第一次读取P1IN之前延迟100毫秒会发生什么?想法#2 - 使SendSetupCommand()等待,直到发送缓冲区为空,以确保外部IC在while循环开始之前收到消息。 – spearson 2012-01-01 10:38:52

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 
} 

这里的关键是“挥发性”关键字,其由编译器禁止变量j的优化,因此你的循环不应该除去。

+0

关于微控制器世界中的“易失性”关键字的一点注意:对由ISR(中断服务例程)和主代码访问的变量使用易失性。每次访问时都应该从RAM中提取这些变量。如果某种形式的优化将其放入寄存器中,以便更快地访问,并且当时ISR想要访问它:ISR将访问RAM而不是寄存器。因此可能存在相同变量的两个不同版本。可能具有不同的值,这是不好的.... – Blup1980 2012-09-16 08:49:53