Run if you want it

C_C++

[C/C++] Volatile

rewyear 2022. 8. 17. 15:59
300x250

volatile의 필요성

/* 작성 코드 */
u32 *ptr = (u32 *) 0xE0000300;
*ptr = 0x1234;
*ptr = *ptr & 0xFF;
  
/* 컴파일러에 의한 최적화 */
u32 *ptr = (u32 *) 0xE0000300;
*ptr = 0x1234 & 0xFF;

상기 예제의 경우 Compiler는 최적화를 위해 *ptr = 0x1234; 를 건너뛰고 맨 마지막 코드처럼 *ptr = 0x1234 & 0xFF; 으로 실행

 

But, 메모리 주소에 연결된 H/W 레지스터에 값을 쓰는 프로그램의 경우 각각의 write 동작이 H/W에 특정 명령을 전달하는 것이므로, 주소가 같다는 이유만으로 중복되는 write명령을 축약해 최적화 해버리면 H/W가 오동작

 

이러한 이유에 의해 volitile 키워드를 사용하여 모든 메모리 write / read 동작에 대하여 최적화를 수행하지 않고 작성한 대로 모두 수행.

/* volatile 키워드를 이용하여 최적화 방지 */
volatile u32 *ptr = (u32 *) 0xE0000300;
*ptr = 0x1234; // 이전과 다르게 최적화에 의해 축약되지 않고 ptr 위치에 0x1234 대입
*ptr = *ptr & 0xFF;

 

volatile 키워드는 크게 3가지 경우에 사용

  • MIMO(Memory-mapped I/O)
  • ISR(Interrupt Service Routine)의 사용
  • Multi Thread 환경
300x250

'C_C++' 카테고리의 다른 글

[C++] 가상함수(Virtual function)와 다형성  (0) 2020.05.31
[C++] CallBack Function(콜백함수)  (2) 2020.01.29