在写一个arduino程序时,使用了for循环,很简单:
int i;
if (light==0) {
for (i = 255; i >= 0; i -= 5) {
analogWrite(10, i);
delay(15);
}
for (i = 0; i <= 255; i += 5) {
analogWrite(10, i);
delay(15);
}
}
后来看到关于arduino内存优化的几种方法,其中一个就是把int等2字节的变量改为使用byte这种1字节的变量代替,byte类型存储数值范围是 0 – 255,因此我将上面的变量i声明由int i;改为了byte i;
byte i; //修改了这里
if (light==0) {
for (i = 255; i >= 0; i -= 5) {
analogWrite(10, i);
delay(15);
}
for (i = 0; i <= 255; i += 5) {
analogWrite(10, i);
delay(15);
}
}
满怀信心的运行,结果在第一个for循环里发生了死循环……
把byte改回int类型正常,百撕不得骑姐。
经过多次尝试发现了问题所在,由于byte的上限和下限是0和255,在for循环的判断中,最后一次i+使i超出了byte的上限255,i被自动赋予了小于255的数值,此数值仍然满足for的循环条件,因此仍然循环,如此往复,导致死循环。
找到原因后,对代码进行了修改如下:
byte i;
if (light==0) {
for (i = 255; i >= 5; i -= 5) { //修改了这里的i>=0
analogWrite(10, i);
delay(15);
}
for (i = 0; i <= 250; i += 5) { //修改了这里的 i <= 255
analogWrite(10, i);
delay(15);
}
}
程序没有再发生死循环。