Empty While loop- Arduino

Empty While loop- Arduino

本文关键字:Arduino loop- While Empty      更新时间:2023-10-16

下面的代码打印一些文本一次,然后等待中断继续打印。while循环用于等待中断发生。我的问题是,当在while循环中添加延迟时,代码运行良好,但当没有延迟时就会失败。原因是什么?ATSAM3X8E的Atmel工作室也出现了同样的问题。

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;
}

编译器不知道更改a值的ISR是否正在运行,因此由于其对循环条件的评估,优化了整个循环输出。您必须将a声明为volatile,以便告诉编译器每次都必须检查其值

volatile int a = 0;