임베디드 용어 사전
C 함정

구조체 패딩

정렬 규칙을 맞추려고 컴파일러가 멤버 사이에 넣는 빈 바이트. 크기와 배치가 예상과 달라진다.

struct A { uint8_t a; uint32_t b; uint8_t c; };
sizeof(struct A);        // 12 — 1+4+1=6 이 아니다

왜 채우나

CPU 는 4바이트 값을 4의 배수 주소에서 읽을 때 가장 빠르고, Cortex-M 일부 접근은 정렬되지 않으면 아예 폴트가 난다. 그래서 컴파일러가 앞뒤로 빈칸을 넣는다.

임베디드에서 문제가 되는 곳

통신 프레임을 구조체로 정의하고 그대로 전송   → 패딩 바이트까지 나간다
플래시에 구조체를 통째로 저장               → 컴파일러가 바뀌면 배치가 달라진다

구조체를 프로토콜로 쓰지 않는 것이 안전하다. 굳이 쓴다면 멤버를 크기 내림차순으로 배치하고 직렬화 함수를 따로 두어 바이트 배열로 명시 변환한다.

packed 는 만능이 아니다

패딩을 없애면 정렬되지 않은 접근이 생기고, 아키텍처에 따라 폴트나 느린 접근이 된다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 임베디드 C 함정 — 컴파일은 되는데 틀린 것들