可以在嵌入式系统固件中使用位域吗?

Ahm*_*iem 1 c embedded

我看到一些嵌入式系统固件书籍/文章建议不要使用 C 的结构位域,因为它不可移植。我知道顺序和填充是实现定义的,但是使用位域总是不可移植的吗?
我的意思是,例如,如果我为 8 位微控制器驱动程序定义了一个配置结构,如下所示:

typedef struct
{
  int channel_name :3 ; /*7 possible channels*/
  int Enable :1 ;  /*if 1 enable,otherwise disable*/
  int Mode;
} conf_t 
Run Code Online (Sandbox Code Playgroud)

我不明白在这种情况下,实现定义的行为如何引发可移植性问题,谁能解释一下?

Lun*_*din 5

以下是一些可能发生的可移植性问题:

  • 字节填充问题。这个结构的大小是多少?
  • 由它引起的字节序和位顺序问题。将channel_name在 3 MSB 或 3 LSB 中分配?
  • 当你声明一个int大小为 1的位域时,不同编译器的不同行为。那个位是什么,符号位或数据?在位域中(并且仅在那里),编译器可以将int其视为有符号或无符号,并且在有符号的情况下,它们在符号位方面的行为可能有所不同。
  • 在同一位域中混合不同类型时的位/字节填充行为。

然后还有一堆其他定义不明确的事情,但不太可能在现实中引起实际问题。