-
Volatile 키워드Software/C++ 2024. 8. 14. 15:17728x90
Volatile
Volatile 키워드가 변수 앞에 붙으면 컴파일 단계에서 최적화를 하지 않겠다라는 의미이다.
이것이 무슨 말인지 이해하기 위해서는 임베디드 시스템의 구조와 컴파일러 단계에서 어떻게 최적화를 진행하는지 이해가 필요하다.
만약 임베디드 시스템에서 0x80AA번지에 값을 여러번 변경하여 코드를 수행하는 작업을 진행한다고 가정해보자.
(int * )0x80AA = 0x01;
(int * )0x80AA = 0x02;
(int * )0x80AA = 0x03;
(int * )0x80AA = 0x04;
(int * )0x80AA = 0x05;이 때 임베디드 시스템에서는 같은 레지스터에 쓰이는 값들이지만 순차적으로 다른 코드에서 해당 레지스터 값을 참조하여 시퀀스를 수행할 것이다. 그런데 똑똑한 컴파일러는 컴파일 과정에서 이를 비효율적인 코드수행으로 보고 앞의 모든 과정을 무시한 채 마지막 결과인 0x05만 바로 수행하고 넘어갈 수 있다. 컴파일러 입장에서는 효율적으로 코드를 진행한답시고 앞의 네개의 값을 생략할 수 있겠지만, 임베디드 시스템 입장에서는 그렇게 되면 코드진행이 꼬일 가능성이 매우 높다.
예컨데 다음과 같은 경우들에서 문제가 될 확률이 상당히 높다.
1. 해당 예시처럼 한 개의 메모리에 여러개의 정보가 순차적으로 입력되어야 할 경우(예를들어 CAN RX)
2. 인터럽트 핸들러가 이벤트 메세지를 보내는 전역변수 ( 메세지 왔어요~ 변수)
3. 멀티쓰레드에서의 전역변수 ( critical section 등 )
4. For문 등 반복문에서 마지막 값이 레지스터나 포인터에 쓰여지는 경우. (ex : CAN send)따라서 이런 경우에는 컴파일러가 제멋대로 최적화를 진행하지 않도록 막아줘야 임베디드 시스템 입장에서는 논리적인 코드 진행이 되는데, 이 때 사용하는 키워드가 바로 Volatile이다.
변수 앞에 Volatile 을 붙이면 해당 변수나 레지스터 값은 최적화를 진행하지 않고 모든 코드에서 사용되게 되는 것이다. 따라서 해당 키워드는 앱 단계에서의 코딩에서는 거의 쓰여질 일이 없지만, 레지스터를 직접적으로 다루는 임베디드 시스템의 영역에서는 아주 중요한 키워드가 되시겠다.
728x90'Software > C++' 카테고리의 다른 글
IEEE 754 부동 소수점 표준 (0) 2024.08.19