以下代码打印一些文本并等待中断继续打印。 while循环用于等待中断发生。 我的问题是,当在while循环中添加延迟时代码工作正常,但是在没有延迟时失败。 它是什么原因? Atmel工作室也为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;
}
答案 0 :(得分:4)
编译器不知道改变a
值的ISR是否会运行,因此通过评估循环条件优化了整个循环。您必须将a
声明为volatile
,以便告诉编译器每次都必须检查其值 。
volatile int a = 0;