Следующий код печатает некоторый текст один раз и ожидает прерывания, чтобы продолжить печать.
Цикл 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;
}
Компилятор не знает, что ISR, который изменяет значение a
когда-либо выполняется, и поэтому оптимизировал весь цикл из-за его оценки состояния цикла. Вы должны объявить a
как volatile
чтобы сказать компилятору, что его значение должен проверяться каждый раз.
volatile int a = 0;
Других решений пока нет …