본문 바로가기

C Programming/C언어 강좌

Volatile이란?

vlolatile은 C 키워드 중 하나이다.

위 키워드를 이해하기 위해선 Optimize 옵션에 대해 알아야한다.

Optimize 옵션은 C 컴파일러의 코드 최적화 옵션을 말한다.

*(unsigned int *)0x70A0 = 0x4001; // 0번
*(unsigned int *)0x70A0 = 0x4002; // 1번
*(unsigned int *)0x70A0 = 0x4003; // 2번
*(unsigned int *)0x70A0 = 0x4004; // 3번
*(unsigned int *)0x70A0 = 0x5555; // 4번

위의 코드를 컴파일러 입장에서 보면 0~3번까지는 아무 필요없는 코드가 된다. 따라서 Optimize 옵션.즉, 코드 최적화를 위해 0~3번까지 코드를 전부 제거하고 4번 코드만 컴파일해서 어셈블리 코드를 만든다.

사실 Software인 컴파일러의 입장에서 Optimize는 당연한 것이라 볼 수 있다. 그러나 Hardware(embedded System)인 입장에서는 이러한 C 컴파일러의 최적화(Optimize)가 치명적 결과를 초래할 수 있다.

만약 위의 0x70A0의 주소를 메모리 주소가 아닌 peripheral에 접근하는 MMR(Memory Mapped Register)라 하자.

그러면 이 레지스터는 단순히 값을 저장하는 역할이 아닌 peripheral을 제어하는 역할을 한다. 즉, 0~4번까지의 각자의 맡은바 역할이 있는 것으로 되어 여기서 Optimize를 당하면 안되는 것이다.

그래서 이때, 사용하는 C 키워드가 volatile이다.

*(volatile unsigned int *)0x70A0 = 0x4001; // 0번
*(volatile unsigned int *)0x70A0 = 0x4002; // 1번
*(volatile unsigned int *)0x70A0 = 0x4003; // 2번
*(volatile unsigned int *)0x70A0 = 0x4004; // 3번
*(volatile unsigned int *)0x70A0 = 0x5555; // 4번
volatile 키워드가 필요한 경우는 Hardware 적으로는 꼭 필요하나 software 관점에선 불필요한 코드의 Optimize를 막기위해 volatile가 필요하다는 점.

Peripheral을 access할때는 무조건 volatile을 사용해야 한다.