예를 들어, 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;
}
'Computer Science > C 언어' 카테고리의 다른 글
[C언어] 현재 작업 디렉터리 위치 알려주는 함수 (getcwd) (0) | 2022.03.12 |
---|---|
[C언어] mysql 라이브러리 (libmysql) (0) | 2022.01.25 |
[C언어] 작업 디렉터리(폴더) 변경 함수 (chdir) (0) | 2021.09.19 |