임베디드 용어 사전
기초·메모리

비트필드

구조체 멤버에 비트 수를 지정하는 C 문법. 배치가 구현에 달려 있어 하드웨어 레지스터 매핑에는 권하지 않는다.

struct {
    unsigned enable : 1;
    unsigned mode   : 2;
} reg;      // 편해 보이지만

왜 레지스터에 쓰면 안 되나

C 표준이 어느 끝부터 채우는지, 어떻게 정렬하는지를 정하지 않는다.

컴파일러 A   최하위 비트부터 채운다
컴파일러 B   최상위 비트부터 채운다

같은 코드가 다른 툴체인에서 다른 비트를 건드린다. 이식성이 요구되는 펌웨어에서 치명적이고, MISRA 도 이 이유로 사용을 제한한다.

또 하나 — 접근 폭

비트필드 하나를 수정할 때 컴파일러가 몇 바이트를 읽고 쓸지 정해져 있지 않다. 32비트 레지스터에 16비트 접근을 하면 동작하지 않는 주변장치가 많다.

대안

마스크와 시프트를 명시적으로 쓴다. 길어 보여도 어느 비트를 어떤 폭으로 건드리는지가 코드에 그대로 드러난다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 비트 조작 — 레지스터를 정확히 건드리는 법