struct {
unsigned enable : 1;
unsigned mode : 2;
} reg; // 편해 보이지만
왜 레지스터에 쓰면 안 되나
C 표준이 어느 끝부터 채우는지, 어떻게 정렬하는지를 정하지 않는다.
컴파일러 A 최하위 비트부터 채운다
컴파일러 B 최상위 비트부터 채운다
같은 코드가 다른 툴체인에서 다른 비트를 건드린다. 이식성이 요구되는 펌웨어에서 치명적이고, MISRA 도 이 이유로 사용을 제한한다.
또 하나 — 접근 폭
비트필드 하나를 수정할 때 컴파일러가 몇 바이트를 읽고 쓸지 정해져 있지 않다. 32비트 레지스터에 16비트 접근을 하면 동작하지 않는 주변장치가 많다.
대안
마스크와 시프트를 명시적으로 쓴다. 길어 보여도 어느 비트를 어떤 폭으로 건드리는지가 코드에 그대로 드러난다.