我需要在 32 位架构上处理 8 位位字段结构的字节序吗?

问题描述 投票:0回答:2

我正在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 embedded endianness unions bit-fields
2个回答
3
投票

字节顺序仅是多字节变量的问题,因此在您的情况下这不是问题。

但是,位字段的使用可能会带来可移植性问题。 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;

3
投票

如果我想让这段代码可移植

那么不要使用位域。使用位运算。

其他字节序的顺序相反?

是的,但这是特定于编译器的,即不可移植。在 gcc 上,您可以使用 gcc 中的位域字节序 .

在这种情况下不存在字节序问题吗?

是的,但不仅如此 - 编译器可以在结构成员之间插入任何填充,

uint8_t
可能支持位字段,并且编译器选择在字节内创建位的“字节序”。

© www.soinside.com 2019 - 2024. All rights reserved.