포인터: 주소를 다루면 레지스터가 보인다
포인터는 주소를 담는 변수입니다. 특정 주소를 읽고 쓰는 것이 레지스터 제어의 전부라는 점을 정리했습니다.
변수는 메모리 어딘가에 있고, 그 위치가 주소입니다. 포인터는 그 주소를 값으로 가진 변수입니다.
uint32_t x = 10;
uint32_t *p = &x; // x의 주소
*p = 20; // 주소를 따라가서 값을 바꿈, 이제 x는 20
레지스터 제어와의 관계
MCU의 주변장치 레지스터는 정해진 주소에 있습니다. 데이터시트에 GPIOA의 출력 레지스터가 0x40020014라고 적혀 있다면, 그 주소를 포인터로 만들어 쓰면 핀이 움직입니다.
#define GPIOA_ODR (*(volatile uint32_t *)0x40020014)
GPIOA_ODR |= (1u << 5); // PA5 HIGH
STM32의 GPIOA->ODR 같은 표현도 결국 구조체 포인터로 이 주소를 가리키는 것입니다.
자주 하는 실수
- 초기화하지 않은 포인터를 따라가기
- 이미 사라진 지역 변수의 주소를 쓰기
- 포인터 자료형 크기를 잘못 써서 옆 레지스터까지 건드리기