空循环 - Arduino

时间:2013-11-21 05:30:56

标签: c++ while-loop arduino atmel

以下代码打印一些文本并等待中断继续打印。 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;
}

1 个答案:

答案 0 :(得分:4)

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

volatile int a = 0;