무언가 만들기 위한 지식/C,C++,Embedded C
[Embedded C] Volatile 한정자
신럭키
2010. 2. 18. 15:47
처음 Embedded C를 접했을 당시, 처음보는 지정자인 volatile이라는 선언을 보게 되었다.
가장 많이 사용되는 선언은
#define PA (*(volatile unsigned char *)0x30000000)
.
.
이런식으로 메모리의 주소를 직접 지정하여 사용할때, 헤더파일에 지정되어 사용되었다.
위와 같은 선언을 통해서
PA라는 PA라는 변수를 통해 해당 IO등에 접근하여 bit값을 바꿔주고는 한다.
volatile의 단어 뜻을 살펴보면 다음과 같다. (Daum 영어사전)
- [vol·a·tile]
- volatile matter 휘발물
- 변덕스러운; 들뜬; 경박한; 쾌활한; 민첩한
- a volatile disposition 변덕스러운 성질
- (정세·상황 따위가) 불안정한, 일촉즉발의
- 덧없는, 순간적인, 일시적인; (가격·가치 등이) 심하게[끊임없이] 변동하는
- [컴퓨터] (메모리가) 휘발성의 (전원을 끄면 데이터가 소실되는)
이처럼 volatile이란 변수는 휘발성이라는 의미가 있다.
이는 주로 embedded C에서 사용되게 되는데,
크게 2가지 목적으로 사용된다.
1. No-Cache Mode로 사용하기 위해서이다.
보통 프로그램 실행시 속도를 위해 CPU에서 데이터를 메모리에서 직접 읽어오지 않고, 캐시(Cache)를 통해서 읽어오게 된다. 하지만, 하드웨어에 의해서 변경되는 값들은 캐시에서 바로 반영되지 않기 때문에 캐시를 통해 읽어오지말고, 직접 메모리에서 읽어와야한다.(속도는 조금 늦춰지긴 한다.)
- 하드웨어가 사용하는 메모리는 volatile로 선언해 줘야 한다.
ex)
#define rTEMP1 (*(volatile unsigned char *)0x30000028)
#define rTEMP2 (*(volatile unsigned char *)0x30000032)
#define rTEMP1 (*(volatile unsigned char *)0x30000028)
#define rTEMP2 (*(volatile unsigned char *)0x30000032)
2. 컴파일러 최적화가 임의로 코드를 변경하는 것을 방지한다.
단계별 최적화 옵션을 사용하게 되면 컴파일러에 따라 전체 코드상 사용되지 않는 DeadCode등은 아예 삭제되거나 무시되는 경우가 있다. 이러한 점은 프로그래머의 의도와는 다르게 기계적 해석에 따라 결과물이 나올 수도 있게 된다. 이러한 경우 프로그래머의 의도가 명확한 경우 volatile을 사용하여 컴파일 최적화를 하지 않게 지정할 수 있다.