alignment. 주소가 타입 크기의 배수여야 한다는 규칙이다.
uint8_t buf[8];
uint32_t *p = (uint32_t *)&buf[1]; // 1번지 — 4의 배수가 아니다
uint32_t v = *p; // UsageFault 가능 (UNALIGNED)
Cortex-M 에서의 실제
- 일부 명령(다중 로드/스토어, 비트밴딩 등)은 정렬되지 않으면 무조건 폴트
- 일반 로드/스토어는 허용될 수 있으나 느리다
SCB->CCR의 UNALIGN_TRP 비트를 켜면 모든 비정렬 접근을 폴트로 잡아낸다 — 개발 중에 유용하다
자주 나오는 상황
수신 버퍼의 중간을 구조체 포인터로 캐스팅
패킹된 구조체의 멤버 주소를 포인터로 넘김
둘 다 정렬을 깨뜨린다. 바이트 단위로 읽어 조립하면 안전하고 이식성도 얻는다.