본문 바로가기

공부생각/AVR C

[AVR_C] Volatile 변수에 대해서



AVR C 에서는 Volatile변수를 주로 사용한다.
이는 컴파일할때 최적화를 막아주기 위함이라고 하는데,
솔직히 이해안되서 그냥 모든 변수를 volatile이라고 선언해 주다가....

이제 좀 알겠다 싶어 적는다.

Volatile은 위에서 말한데로 컴파일하는데 최적화를 막아주는 방법이다.

컴파일할때 최적화를 시켜주는 경우가 있는데 한 변수가 바뀌는 코드가 없이 한 코드안에서 계속 사용되면, 이 변수를 얻으러 메인메모리까지 가기가 귀찮아서 로컬레지스트에 저장해놓는다.

예를 들어 int i = 100; 해놓고
아래에서 setValue(i); 뭐 이런식으로 만 쭈욱 써놨지,
i = i+20; 처럼 변수를 변형하는 꼴이 없다면 그냥 가까운 곳에 복사해놓는다는 것이다. 하지만 문제가 되는게, 특히 임베디드 시스템에서는 그런 코드의 부분이 없어도 인터럽트에 의해 값이 변경 될 수 있다.

컴파일할때는 주변상황없이 코드만 읽게되는데, 그 인터럽트에 관해서는 코드에 정확하게 나와있지는 않으므로, 컴파일러는 마치 이 변수는 변하지 않는구나 가까운데 두자, 해버릴 수 있다는 얘기다.


그리서 특히 임베디드 시스템에서 인터럽트나 다른 것들에 의해서 바뀌는 변수들은 volatile로 지정해서, 로컬메모리에 저장하는 꽁수? 를 쓰지 못하도록 하게 한다.

예를 들어 i라는 변수가 선언되고 계속 사용되는데, 컴파일러가 이미 로컬레지스터에 이 값을 복사해놓고 사용하고 있다면, 인터럽트에 의해서 i라는 변수가 바뀐다 할 지라도 로컬레지스트에 있는 값을 계속 읽어와서 i가 바뀌지 않게 되버리는 경우가 생길 수 있다.

이러면 곤란하니께~ Volatile이라고 선언해주어

"니 멋대로 최적화 하지말고, 항상 메인메모리에서 가져오너라."

라고 컴파일러에게 알려주는 것이다.