지시자(directive)인 volatile 은 변수 선언문의 변수형 앞에 두어서 컴파일러가 그 변수를 접근하는 방식을 지정한다.


 일반적으로 변수 데이터는 런타임에 RAM영역에 저장되지만 어떤 변수는 레지스터(register)에 임시로 저장되어 사용하기도 하는데 이 경우 속도면에서는 월씬 유리하지만 RAM에 저장된 실제 데이터와 레지스터에 저장된 (임시)데이터가 서로 다른 경우가 발생할 수도 있다.


 어떤 변수를 volatile로 지정하면 그 변수 데이터는 레지스터의 임시 저장소가 아니라 RAM에서 직접 읽어오도록 컴파일된다. 아두이노 프로그램의 경우 보통은 volatile로 정의할 필요는 없으나 인터럽트 서비스 루틴 (ISR) 내부에서 그 값이 변경되는 변수는 반드시 volatile로 선언해야 실시간으로 변경되는 데이터 값을 ISR 외부에서 정확하게 읽어올 수 있게 된다. 예를 들면 다음과 같다.


// toggles LED when interrupt pin changes state

int pin = 13;
volatile int state = LOW;

void setup()
{
 pinMode(pin, OUTPUT);
 attachInterrupt(0, blink, CHANGE);
}

void loop()
{
 digitalWrite(pin, state);
}

void blink()
{
 state = !state;
}


위의 예에서 blink()함수가 ISR이며 이 안에서 변경되는 변수 state는 volatile로 지정하였음을 확인할 수 있다.

(출처 : https://www.arduino.cc/en/Reference/Volatile )



Posted by 살레시오
,