我在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 字节处填充。我该如何纠正这种行为?
答案 0 :(得分:4)
我自己修理了 - >使用-mno-ms-bitfields进行编译有帮助!上面的代码确实是正确的。有必要告诉mingw使用gcc的位域组织而不是微软风格。虽然代码可能无法用微软编译器编译,但我现在并不在意。
答案 1 :(得分:1)
根据the GCC manual's examples,attribute
应该在结构的字段之后,即:
// 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;