volatile 은 휘발성이라는 뜻이다. 현재 쓰레드의 프로그램이 아닌 다른 곳에서 값이 변할 수 변수는 volatile로 선언하여야 한다.
다음과 같은 코드가 있다고 하자.
int i=0; int flag=0; for(int k=0; k<10; k++) { if(i!=0) { flag = 1; break; } } |
일반적으로 분석하면 i는 0이기 때문에 for 문을 10번 수행하고 빠져나온다. i는 0이기 때문에 if 문이 동작하지 않는다.
하지만, C 컴파일러에 최적화(Optimization) 옵션을 켜면 컴파일러는 코드를 분석하여 i는 항상 0이기 때문에 for 문을 10번 실행하지 않고 저 코드를 무시해 버리고 기계어로 변환하다. 그래서 flag은 항상 0이 된다.
하지만, 저 코드를 무시했을 때, i가 인터럽트(Interrupt)에서 사용하는 전역변수이거나 i가 하드웨어 I/O에 연결된 변수라면 문제가 될 수 있다. 그 때는 for 문 실행 중 인터럽트나 I/O에서 i가 변경될 수 있다. 그래서, 프로그램 의도는 10번 i를 검사해서 0이 아닐 때 flag=1 설정하고 for 문을 빠져 나오는 것인데 컴파일러는 완전히 무시해 버린다.
이 때 사용하는 것이 volatile이다. i를 다음과 같이 선언하면 컴파일러는 i가 사용된 코드를 최적화 하지 않는다. 그래서 있는 그대로 프로그램이 실행된다.
volatile int i=0;
임베디드 시스템 프로그래밍 할 때는 하드웨어를 건드리는 일이 많고 인터럽트도 많이 사용하기 때문에 volatile을 굉장히 많이 사용한다. 인터럽트에서 volatile을 사용하지 않는 실수를 하기 쉽다.
어떤 사람들은 임베디드 시스템에서는 최적화 옵션을 무조건 꺼라고 말하는 사람도 있다. 하지만, 개발하다 보면 실행 시간 때문에 어쩔 수 없이 최적화를 해야 하는 경우가 많다.
'컴퓨터공학 > C,C++,C#' 카테고리의 다른 글
넷 프레임워크 설치 버전 확인하는 방법 (0) | 2017.09.08 |
---|---|
[C#] textBox에서 마지막 줄까지 스크롤하기 (0) | 2017.08.29 |
C++의 Class 기본 사용법 (0) | 2017.08.19 |
C에서 static 사용 (0) | 2017.08.06 |
C에서 가장 실수하기 쉬운 버그 (0) | 2017.08.06 |
댓글