C언어

[C언어] volatile 키워드란?

_minit 2024. 10. 11. 09:18

volatile은 C언어에서 변수의 값이 언제든지 변경될 수 있음을 컴파일러에 알려주는 키워드이다. 주로 MCU의 레지스터, 인터럽트에 의해 변경될 수 있는 변수, 다중 쓰레드 환경에서 사용된다. 최적화 방지를 위해 사용되며, 컴파일러가 불필요한 최적화를 하지 않도록 보장한다.

 

컴파일러는 코드의 속도를 위하여 코드 최적화를 수행한다. 

 

#define control_register 0x7FFF

*(unsigned int *)control_register = 0x0001;
*(unsigned int *)control_register = 0x0004;

 

코드에서는 0x7FFF를 0x0001로 바꾸고 0x0004로 바꾼다. 결과적으로 0x0004로 바뀌기 때문에 컴파일러는 최적화를 위해

0x0001로 바꾸는 작업을 무시하고 마지막 줄 코드만 실행시킨다. 이런 최적화를 통해 속도가 빨리 진다.

하지만 하드웨어 레지스터에 값을 쓰고 각각의 명령을 전달하는 코드이기 때문에 오류가 발생하거나 원하는 작업이 안 나올 수 있다.

이때 vlatile 키워드를 사용하여 최적화를 방지할 수 있다. 또한 읽는 것도 마찬가지이다.

 

#define control_register 0x7FFF

*(volatile unsigned int *)control_register = 0x0001;
*(volatile unsigned int *)control_register = 0x0004;

 

volatile 키워드는 캐시메모리에 올라가지 않는다.

값이 외부 요인(예 : 하드웨어 레지스터, ISR, 스레드)에 의해 빠르게 변경될 수 있기 때문이다. 이러한 값들이 캐시 메모리에 저장되면, 시스템이 최신의 데이터를 읽어오지 못할 가능성이 크다.

 

캐시 메모리는 CPU가 데이터를 빠르게 접근하기 위해 사용하는 임시 저장소이다. 일반적인 경우, 컴파일러는 메모리에 대한 직접 접근을 줄이려고 캐시에 저장하는 최적화를 수행한다. 하지만 외부 요인에 의해 값이 변경되면 즉, 메모리에서 읽은 후 CPU의 캐시에 저장되어 있을 때 그 사이의 값이 바뀌면 캐시에 있는 값은 업데이트가 되지 않는다. 값이 달라지게 되는 것이다.

 

이러한 문제를 극복하기 위해 캐시메모리에 올라가지 않는, 변수의 값이 언제든지 변경될 수 있는 volatile 키워드를 사용하여 항상 메모리와 동기화된 값을 사용할 수 있도록 보장한다.

 

 

MCU개발에서는 중요하니 확실히 이해했으면 한다.

728x90

'C언어' 카테고리의 다른 글

[C언어] main문이란?  (0) 2024.10.14
[C언어] static 키워드란?  (0) 2024.10.11
[C언어] 구조체, 열거형, 공용체란?  (0) 2024.10.10
[C언어] 쉬프트 연산과 비트 연산  (0) 2024.10.10
[C언어] (void *) 포인터란?  (0) 2024.10.10