ETC

2013.05.15_volatile짚고감_

성엽이 2013. 5. 15. 23:58

(*((volatile unsigned int *)(addr)))

 


여기서 괄호를 빼면

*(volatile unsigned int *)addr

이 됩니다


volatile 은 전원끄면 내용 날라가는 메모리 즉 RAM 영역을 지정하는 단어입니다


(volatile unsigned int *)addr 은 addr을

RAM영역의 unsigned int형 pointer로 보라는 (type casting) .


따라서

*(volatile unsigned int *)addr 은 unsigned int형 포인터인 addr 이 가리키는 값, 즉 addr번지의 내용(32bit)이 됩니다


예를 들어


(*((volatile unsigned int *)(1234))) = 5678;

이 문장은

RAM의 1234 번지에 5678 을 써넣는 문장이 되고


int a=(*((volatile unsigned int *)(1234)));

이 문장은RAM 1234 번지의 내용을 읽어 그 값을 변수 a 에 넣으라는 문장이 됩니다

re: (*((volatile unsigned int *)(addr)))

volatile이라는 형은 값이 이 데이타를 포함하고 있는 프로그램에의해 영향을 받지 않고 다른 프로그램 외부에 의해 값이 변할 수 있는 값이 라는 것입니다.
특정 물리 메모리 주소에 쓰여지는 값을 여러 프로그램에서 공유하여 변경될 수 있을때 사용할 수 있습니다.
예로 시리얼 포트로 들어오는 값들(특정I/O 주소에 값이 저장되죠)

 

(volatile unsigned int *)는 포인터(addr)를 volatile unsigned int 포인터 형으로 바꾸라는 것입니다.
(*((volatile ...
에서 *는 포인터에 저장된 값 (주소를따라간 그 안에 값) 이란 의미입니다.

결국 addr이란 포인터가 저장하고 있는 주소값을 unsigned int의 주소값으로 받아들이고 이곳에 저장된 unsigned int값을 가져오라는 것입니다.