Empty While 循环 - Arduino
Posted
技术标签:
【中文标题】Empty While 循环 - Arduino【英文标题】:Empty While loop- Arduino 【发布时间】:2013-11-21 05:30:56 【问题描述】:以下代码打印一些文本并等待中断继续打印。 while 循环用于等待中断发生。 我的问题是,当在 while 循环中添加延迟时,代码可以正常工作,但在没有延迟时会失败。 这是什么原因? 同样的问题发生在 Atmel studio for ATSAM3X8E。
int a = 0;
int thisByte = 33;
void setup()
Serial.begin(9600);
attachInterrupt(0, keyPadISR, LOW);
Serial.println("ASCII Table ~ Character Map");
void loop()
// This is a dummy code to say program is running
Serial.write(thisByte);
Serial.print(", dec: ");
Serial.print(thisByte);
Serial.print(", hex: ");
Serial.print(thisByte, HEX);
Serial.print(", oct: ");
Serial.print(thisByte, OCT);
Serial.print(", bin: ");
Serial.println(thisByte, BIN);
while(a != 10)
// Program does not work if u delete this delay(1).
delay(1);
thisByte++;
// This is the key pad interrupt
void keyPadISR()
a = 10;
【问题讨论】:
“无延迟”是否包括使用delay(0);
之类的行?
您是否遇到编译或运行时错误?我可以理解运行时错误,因为你会陷入无限循环。
delay(0) 工作正常,但是当我将循环留空时它不起作用。延迟(0)在 ATSAM3X8E 的 atmel 工作室中也不起作用。
@KepaniHaole 它发生在运行时。如果中断改变 a 的值,则不会发生无限循环条件。
【参考方案1】:
编译器不知道改变a
值的ISR 曾经运行过,因此由于它对循环条件的评估而优化了整个循环。您必须将a
声明为volatile
,以便告诉编译器每次都必须检查其值必须。
volatile int a = 0;
【讨论】:
如果您碰巧也在寻找 C++11 的正确性,您可能希望使用sig_atomic_t
变量。尽管实际上,在大多数平台上 volatile 都可以。以上是关于Empty While 循环 - Arduino的主要内容,如果未能解决你的问题,请参考以下文章