본문 바로가기
컴퓨터/C

[C] volatile 선언문

by Begi 2016. 4. 3.
반응형

volatile은 휘발성이라는 뜻으로 C, C++, JAVA 등에서 변수를 volatile로 선언하면 그 변수는 액세스할 때마다 값이 달라질 수 있다는 것을 의미한다.

 

다음은 volatile로 선언되어 있지 않는 일반 변수 i를 사용한 C 코드이다.

 

 <예#1>
 int i=0;
 for(;;)
 {
    if(i!=0) break;
 }

 

위의 코드는 일반적인 상황에서 다음 코드와 동일한 동작을 하고 C 컴파일러에서 최적화 옵션에 따라 실제로 아래와 같이 변환하여 컴파일을 실행한다.

 

 <예#2>
 int i;
 while(1);

 

하지만, 만약 다른 인터럽트 루틴에서 i을 값을 변화 시킨다면, <예#1>을 <예#2>와 같이 변환 시키지 말아야 한다. 또는, 변수 i가 외부 포트의 값을 읽는 변수라면 또한 변화 시키지 말아야 한다. 즉, 이와 같은 상황에서는 for 루프에서 계속해서 i값을 읽어야 하지만, C 컴파일러는 그런 상황을 모르기 때문에 <예#1>와 같은 코드를 <예#2>로 변환 시켜 버린다.

 

이때, 이러한 C 컴파일러의 변환을 막아주는 선언이 volatile이다. volatile로 선언된 변수는 그 변수 값이 읽을 때마다 다른 값을 될 수 있기 때문에 C 컴파일러에서 최적화 하지 않고 코드 그대로 실행한다. volatile은 다음과 같이 사용한다.

 

 <예#3>
 volatile int i=0;
 for(;;)
 {
    if(i!=0) break;
 }

 

volatile로 변수를 선언하면 그 변수를 사용하는 부분은 최적화가 되지 않기 때문에 속도 감소와 코드 크기 증가가 발생할 수 있다.

 

인터럽트와 외부 포트를 많이 사용하는 임베디드 시스템 프로그램 작성 시에는 반드시 알아야 하는 매우 중요한 선언문이다. volatile 문제로 버그가 발생했을 때 디버깅이 매우 어렵다.

 

반응형

'컴퓨터 > C' 카테고리의 다른 글

C의 min, max 함수  (0) 2019.10.17
[C] 포인터의 이해  (0) 2019.02.05
C++ 연산자 오버로드  (0) 2018.08.13
C 언어 나누기 연산  (0) 2018.06.26
C 언어  (0) 2016.03.05

댓글