본문 바로가기

Computer Science/C 언어

[C언어] 특정 메모리 주소에 직접 값 쓰기

예를 들어, 0x2000100 번지에 0x12345678 이라는 값을 넣으려고 해봅시다. 

 

1. 컴파일 에러 예시

*(0x2000100) = 0x12345678; 

 

2.주소임을 알려주기 위해 (*)를 추가해줍니다. 

*((*)0x2000100) = 0x12345678; 

 

3. 0x20인 4 byte 만 저장할 것이기 타입을 정해줍니다. 

*((unsigned long*) 0x20000100) = 0x12345678; 

 

4. Avoid compiler optimization

volatile은 컴파일러에게 당신의 변수가 접근하고 있는 코드가 아닌 다른 방법으로 변경될 수 있다고 알려주는 역할을 합니다.

*((volatile unsigned char *) 0x20000100) = 0x12345678; 

 

조금 더 편하게 지정해놓고 사용하기 위해서는 #define 을 통해 정의해놓고 사용할 수 있습니다. 

#define BASE_ADDR (*((volatile unsigned char *) 0x20000100))

BASE_ADDR = 0x12345678; 

 

#define HWREG(x) (*((volatile unsigned long *) (x))) 
int main(void) { 
    HWREG(0x20000100) = 0x12345678; 
	return 0; 
}