我正在32位架构(确切地说是AVR32)上做一些嵌入式软件。 在此软件上,我从通过 I2C 连接的外围设备检索一个以一个字节编码的标志。
该字节的每一位都是一个布尔变量。 结构如下:
typedef union __attribute__((packed)){
struct __attribute__((packed)) {
uint8_t flag_a : 1;
uint8_t flag_b : 1;
uint8_t flag_c : 1;
uint8_t flag_d : 1;
uint8_t flag_e : 1;
uint8_t __unused : 3;
}
uint8_t raw;
}Flag_t;
我的问题是,如果我想让这段代码可移植,我是否需要以相反的顺序重新定义联合内的结构以获得其他字节序?
或者,在这种情况下不存在字节序问题吗?
字节顺序仅是多字节变量的问题,因此在您的情况下这不是问题。
但是,位字段的使用可能会带来可移植性问题。 C 标准让编译器实现来决定它们的实现方式。因此,不能期望它们在不同环境中表现相同。
更好的选择是简单地使用单个字节并定义不同位的含义。例如:
typedef uint8_t Flag_t;
typedef enum
{
flag_a = 1u << 0,
flag_b = 1u << 1,
flag_c = 1u << 2,
flag d = 1u << 3,
flag e = 1u << 4,
} Flag_Bits_t;
如果我想让这段代码可移植
那么不要使用位域。使用位运算。
其他字节序的顺序相反?
是的,但这是特定于编译器的,即不可移植。在 gcc 上,您可以使用 gcc 中的位域字节序 .
在这种情况下不存在字节序问题吗?
是的,但不仅如此 - 编译器可以在结构成员之间插入任何填充,
uint8_t
可能不支持位字段,并且编译器选择在字节内创建位的“字节序”。