结构填料和mingw对齐

时间:2014-06-03 12:58:54

标签: c arm mingw32 stm32

我在PC(mingw32,32bit arch)上模拟来自嵌入式系统(stm32,KeilμVision5,MDK-ARM)的代码。 ARM编译器的对齐方式与我的桌面 mingw 构建不匹配:

// ARM Code (ARM compiler uses __packed)
typedef __packed struct _file
{
    uint8_t var1;
    uint16_t var2;
} FILE;

// PC mingw gcc code trying to emulate layout above.
typedef struct __attribute__((packed, aligned(1))) _file
{
    uint8_t var1;
    uint16_t var2;
} FILE;


在源代码中,我执行以下操作:file.var1 = 0x22; file.var2 = 0xAA55;然后将其写入内存。当我读取嵌入式系统上的内存时,它会显示0x22, 0x55, 0xAA。在Windows机器上,它读取0x22, 0xFF, 0x55, 0xAA,并在2 nd 字节处填充。我该如何纠正这种行为?

4 个答案:

答案 0 :(得分:4)

我自己修理了 - >使用-mno-ms-bitfields进行编译有帮助!上面的代码确实是正确的。有必要告诉mingw使用gcc的位域组织而不是微软风格。虽然代码可能无法用微软编译器编译,但我现在并不在意。

答案 1 :(得分:1)

根据the GCC manual's examplesattribute应该在结构的字段之后,即:

// PC Code
typedef struct
{
    uint8_t var1;
    uint16_t var2;
} __attribute__((packed, aligned(1))) FILE;

我也放弃了无意义的struct标签(_file)。

当我快速测试时,上面的sizeof值为3

答案 2 :(得分:1)

属性打包为broken on mingw32 compilers。另一种选择是使用 pragma pack

#pragma pack(1)
typedef struct _file
{
  uint8_t var1;
  uint16_t var2;
} FILE;

答案 3 :(得分:0)

为什么不以递减的大小顺序放置struct元素?您不必担心填充字节。

// ARM Code
typedef struct _file
{
    uint16_t var2;
    uint8_t var1;
} FILE;

typedef struct _file
{
    uint16_t var2;
    uint8_t var1;
} FILE;