我正在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
,在第二个字节填充。我如何纠正这种行为?
4条答案
按热度按时间yqyhoc1h1#
我自己修正了这个问题-〉用-mno-ms-bitfields编译会有帮助!上面的代码确实是正确的。有必要告诉mingw使用gcc的bitfield组织而不是microsoft风格。虽然代码可能无法用microsoft编译器编译,但我现在不在乎。
nbnkbykc2#
打包的属性是broken on mingw32 compilers。另一个选项是使用pragma pack:
ar7v8xwq3#
根据the GCC manual's examples,
attribute
应该在结构体的字段之后,即:我还删除了毫无意义的struct标记(
_file
)。当我快速测试时,上面的
sizeof
值为3
。7gs2gvoe4#
只需添加gcc_struct属性来告诉mingw使用哪种结构体打包算法:属性((gcc结构,压缩));