volatile

|
C complier는 프로그래머가 작성한 소스코드를 최척화하여 컴파일한다.
int a;
a = 10;
a = 20;
a = 30;
이라고 작성하면 C Compiler는 가운데 2줄은 쓸데없는 것으로 인식하고 바로 a에 30의 값을 넣어버린다.

이를 Memory-mapped IO라고 해보자.

#define PORTF (*(unsigned char *)0x62) 
PORTF가 자주 쓰이므로 컴파일러는 0x62가 가리키는 메모리에 직접 값을 쓰거나 읽는 대신 cpu의 레지스터 하나에 값을 쓰거나 읽도록 최적화해버립니다.
그러면 여덟개의 스위치를 무작위로 누르면서 PINC에 값을 변화시키면 이 값은 실제 메모리인 0x62에 쓰여지지 않고 cpu의 레지스터에만 써버리기 때문에 PORTF에는 값이 쓰여지지 않게 된다. 그래서 스위치를 눌러도 LED에 불이 들어오지 않는다.

이를 막기 위해 volatile 키워드를 쓴다.
#define PORTF (*(volatile unsigned char *)0x62) 
이렇게 해주면 컴파일러는 최적화를 하지 않는다. 항상 0x62가 가리키는 메모리에 값을 쓰거나 읽는다.
따라서 스위치를 누를때마다 그 값이 실제 메모리 상에 쓰여지게 되므로 LED에 불이 들어온다.

while(1)
{
PORTF = PINC;
}

'C' 카테고리의 다른 글

itoa 대신 sprintf  (0) 2010.06.26
포인터 상수  (0) 2010.06.24
문자열  (0) 2010.06.13
구조체  (0) 2010.06.12
버블 정렬 c 0609  (0) 2010.06.09
And