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的主要内容,如果未能解决你的问题,请参考以下文章

C#中至少包含六个单词的字符串的while循环

广度优先搜索(BFS)模板

C#中MessageBox输出信息

arduino 怎么和上位机通信

围圈报数

R语言-while循环