for循环在Arduino中异常行为

时间:2014-05-28 05:12:11

标签: arduino arduino-ide

考虑C中的以下循环:

int i;
for (i = 1; i > 0; i++);

i到达INT_MAX后,它会以INT_MIN递增。然后i > 0进行评估 false,for循环将终止。

但是,相同的for循环不会在Arduino中终止,因为i > 0比较为false 即使i-32768

为什么?

PS。我使用的是Mega 2560和Arduino版本1.0.5 PPS。在Mega 2560上,int确实是16位 购买力平价。完整的草图如下:

void setup () {
  int i;
  Serial.begin(9600);
  for (i = 1; i > 0; i++);
}

void loop () {
  Serial.println(100);
}

我在串行监视器中看不到任何东西

3 个答案:

答案 0 :(得分:1)

反汇编设置功能给出:

0000014a <setup>:
 14a:   80 e3           ldi r24, 0x30   ; 48
 14c:   94 e0           ldi r25, 0x04   ; 4
 14e:   40 e8           ldi r20, 0x80   ; 128
 150:   55 e2           ldi r21, 0x25   ; 37
 152:   60 e0           ldi r22, 0x00   ; 0
 154:   70 e0           ldi r23, 0x00   ; 0
 156:   42 d2           rcall   .+1156      ; 0x5dc <_ZN14HardwareSerial5beginEm>
 158:   ff cf           rjmp    .-2         ; 0x158 <setup+0xe>

所以现在很清楚:avr-gcc认为i > 0中的for(i = 1; i > 0; i++)永远不会评估false并优化退出条件。

答案 1 :(得分:0)

最有可能的,&#39; int&#39;在Arduino上也是32位。完成2 ^ 31次迭代需要时间。你可以改变&#39; int&#39;短暂的&#39;它应该按预期终止。

答案 2 :(得分:0)

当定义int时,默认情况下,编译器假定其大小为16位。

但是当你增加它超过32767,即

int i=32767;
i++;

&#39; i&#39;的大小自动增加到32位。这是因为声明中未指定大小。

这会导致您的程序停止在32767。

因此,如果你想在32767停止for循环,

您必须明确声明为

short int i;

如果您想验证这一点,可以尝试按照

short int x;
for(x=1; x>0; x++)
{
  mySerial.println(x);
}

int x;
for(x=1; x>0; x++)
{
  mySerial.println(x);
}