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을 사용해야 한다.
'C Programming > C언어 강좌' 카테고리의 다른 글
한빛미디어 "이것이 C언어다" 무료배포 강의 (0) | 2016.03.23 |
---|