C语言 结构填充和与mingw对齐

1bqhqjot  于 2023-03-01  发布在  其他
关注(0)|答案(4)|浏览(145)

我正在PC(mingw 32,32位arch)上模拟嵌入式系统(stm32,Keil µVision 5,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,在第二个字节填充。我如何纠正这种行为?

yqyhoc1h

yqyhoc1h1#

我自己修正了这个问题-〉用-mno-ms-bitfields编译会有帮助!上面的代码确实是正确的。有必要告诉mingw使用gcc的bitfield组织而不是microsoft风格。虽然代码可能无法用microsoft编译器编译,但我现在不在乎。

nbnkbykc

nbnkbykc2#

打包的属性是broken on mingw32 compilers。另一个选项是使用pragma pack

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

ar7v8xwq3#

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

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

我还删除了毫无意义的struct标记(_file)。
当我快速测试时,上面的sizeof值为3

7gs2gvoe

7gs2gvoe4#

只需添加gcc_struct属性来告诉mingw使用哪种结构体打包算法:属性((gcc结构压缩));

相关问题