2017-10-27 19 views
0

주소 0x1ffff670에 메모리 매핑 된 장치가 있다고 가정합니다. 디바이스 레지스터는 8 비트 밖에 가지고 있지 않다. 그 레지스터에 값을 가져와 하나씩 증가 시켜서 다시 써야합니다. 다음메모리 매핑 된 레지스터 액세스

내가이 시나리오가 어떻게 보이는지 생각 메모리에서

, 그렇게 내 접근 방식입니다. enter image description here

void increment_reg(){ 

int c;//to save the address read from memory 
char *control_register_ptr= (char*) 0x1ffff670;//memory mapped address. using char because it is 8 bits 

c=(int) *control_register_ptr;// reading the register and save that to c as an integer 
c++;//increment by one  
*control_register_ptr=c;//write the new bit pattern to the control register 
} 

이 방법이 맞습니까? 많은 감사합니다.

+2

괜찮아 보이지만 포인터를 '휘발성'으로 만들 수 있습니다. – Cornstalks

답변

1

접근 방법이 거의 정확합니다. 즉 일반적으로 더 적합하기 때문에

volatile unsigned char * control_register_ptr = ... 

나는 또한 그것을 unsigned char을 만들 것,하지만 그건 : 유일한 된 부분 - - 질문에 대한 코멘트에서 지적했듯이 지금처럼 포인터 타입에 volatile을 추가 기본적으로 그다지 다르지 않습니다. (값을 바꿀 때 유일한 의미있는 차이가 있습니다.)

volatile 키워드는 컴파일러에게 해당 주소의 값이 프로그램 외부에서 변경 될 수 있음을 나타냅니다. 컴파일러는 알지 못합니다.) 예를 들어, 컴파일러가로드 및 저장을 최적화하는 데있어보다 보수적 인 작업을 수행합니다.