AVR C 에서는 Volatile변수를 주로 사용한다.
이는 컴파일할때 최적화를 막아주기 위함이라고 하는데,
솔직히 이해안되서 그냥 모든 변수를 volatile이라고 선언해 주다가....
이제 좀 알겠다 싶어 적는다.
Volatile은 위에서 말한데로 컴파일하는데 최적화를 막아주는 방법이다.
컴파일할때 최적화를 시켜주는 경우가 있는데 한 변수가 바뀌는 코드가 없이 한 코드안에서 계속 사용되면, 이 변수를 얻으러 메인메모리까지 가기가 귀찮아서 로컬레지스트에 저장해놓는다.
예를 들어 int i = 100; 해놓고
아래에서 setValue(i); 뭐 이런식으로 만 쭈욱 써놨지,
i = i+20; 처럼 변수를 변형하는 꼴이 없다면 그냥 가까운 곳에 복사해놓는다는 것이다. 하지만 문제가 되는게, 특히 임베디드 시스템에서는 그런 코드의 부분이 없어도 인터럽트에 의해 값이 변경 될 수 있다.
컴파일할때는 주변상황없이 코드만 읽게되는데, 그 인터럽트에 관해서는 코드에 정확하게 나와있지는 않으므로, 컴파일러는 마치 이 변수는 변하지 않는구나 가까운데 두자, 해버릴 수 있다는 얘기다.
그리서 특히 임베디드 시스템에서 인터럽트나 다른 것들에 의해서 바뀌는 변수들은 volatile로 지정해서, 로컬메모리에 저장하는 꽁수? 를 쓰지 못하도록 하게 한다.
예를 들어 i라는 변수가 선언되고 계속 사용되는데, 컴파일러가 이미 로컬레지스터에 이 값을 복사해놓고 사용하고 있다면, 인터럽트에 의해서 i라는 변수가 바뀐다 할 지라도 로컬레지스트에 있는 값을 계속 읽어와서 i가 바뀌지 않게 되버리는 경우가 생길 수 있다.
이러면 곤란하니께~ Volatile이라고 선언해주어
"니 멋대로 최적화 하지말고, 항상 메인메모리에서 가져오너라."
라고 컴파일러에게 알려주는 것이다.
이는 컴파일할때 최적화를 막아주기 위함이라고 하는데,
솔직히 이해안되서 그냥 모든 변수를 volatile이라고 선언해 주다가....
이제 좀 알겠다 싶어 적는다.
Volatile은 위에서 말한데로 컴파일하는데 최적화를 막아주는 방법이다.
컴파일할때 최적화를 시켜주는 경우가 있는데 한 변수가 바뀌는 코드가 없이 한 코드안에서 계속 사용되면, 이 변수를 얻으러 메인메모리까지 가기가 귀찮아서 로컬레지스트에 저장해놓는다.
예를 들어 int i = 100; 해놓고
아래에서 setValue(i); 뭐 이런식으로 만 쭈욱 써놨지,
i = i+20; 처럼 변수를 변형하는 꼴이 없다면 그냥 가까운 곳에 복사해놓는다는 것이다. 하지만 문제가 되는게, 특히 임베디드 시스템에서는 그런 코드의 부분이 없어도 인터럽트에 의해 값이 변경 될 수 있다.
컴파일할때는 주변상황없이 코드만 읽게되는데, 그 인터럽트에 관해서는 코드에 정확하게 나와있지는 않으므로, 컴파일러는 마치 이 변수는 변하지 않는구나 가까운데 두자, 해버릴 수 있다는 얘기다.
그리서 특히 임베디드 시스템에서 인터럽트나 다른 것들에 의해서 바뀌는 변수들은 volatile로 지정해서, 로컬메모리에 저장하는 꽁수? 를 쓰지 못하도록 하게 한다.
예를 들어 i라는 변수가 선언되고 계속 사용되는데, 컴파일러가 이미 로컬레지스터에 이 값을 복사해놓고 사용하고 있다면, 인터럽트에 의해서 i라는 변수가 바뀐다 할 지라도 로컬레지스트에 있는 값을 계속 읽어와서 i가 바뀌지 않게 되버리는 경우가 생길 수 있다.
이러면 곤란하니께~ Volatile이라고 선언해주어
"니 멋대로 최적화 하지말고, 항상 메인메모리에서 가져오너라."
라고 컴파일러에게 알려주는 것이다.
'공부생각 > AVR C' 카테고리의 다른 글
I2C IO-expander를 이용한 keypad의 구현 (6) | 2009.08.11 |
---|---|
[AVR C] 1. 서보모터 (Servo motor) 제어_ Atmega32 <뱀!> (2) | 2009.05.24 |