✅ 목표 (Goal)

#include <stdio.h>

int main(void) {
    int a = 11;
    //int b = 22;   // b도 연습해 보자. 

    int* pa = NULL;
    //pa = &a; // 포인터 기본 예제, 보통 여기서 끝나는데, 주소를 직접 넣고 싶다면 아래와 같이 하자.
    //pa = 0xABCD; // 주소를 대입했으니 이건 문법에러, 좌측은 int*, 우측은 int 즉 형이 틀려 에러!
    //pa = (int *)0xABCD; // 문법은 맞지만 0xABCD는 적법한 주소가 아니다! 어디를 가리키는지 모르는 위험한 주소다.
    //pa = (int*)0x004ff76c; // 안전빵 메모리 위치인 a의 주소를 가리켜 보자. ASLR 옵션이 Yes 상태라서, 다시 실행할때마다 주소가 바뀐다.
    pa = (volatile unsigned int*)0x0019fedc;   // ASLR 옵션을 끄고, a의 주소를 입력해보자.

    //printf("a= %d\\r\\n", a);
    //printf("&a= %p\\r\\n", &a);
    //printf("*pa= %d\\r\\n", *pa);
    
    printf("%d\\r\\n", a); // a= 11 출력
    *(volatile unsigned int *)0x0019fedc = 999; // a= 999;
    printf("%d\\r\\n", a); // a = 999 출력된다.    
    return 0;
}

✅ AVR 실습의 예

주소로 직접 제어하기 때문에

DDRA, PORTA가 정의된

#include <avr/io.h>도 필요 없어진다.

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void) {
	DDRA = 0x99;  
	PORTA = 0x11;
	while(1) {
	}
}
#define F_CPU 16000000UL

int main(void) {
	*(volatile unsigned int *)0x3a = 0x99;  
	*(volatile unsigned int *)0x3b = 0x11;
	while(1) {
	}
}

✅ 라즈베리파이

아래 3개 레지스터의 주소 할당하기