cla*_*ake 5 c arm stm32 mingw32
我在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;
Run Code Online (Sandbox Code Playgroud)
在源代码中,我执行以下操作:file.var1 = 0x22; file.var2 = 0xAA55;然后将其写入内存.当我读取它显示的嵌入式系统上的内存时0x22, 0x55, 0xAA.在Windows机器上读取0x22, 0xFF, 0x55, 0xAA,与在2填充第二个字节.我该如何纠正这种行为?
我自己修复了它 -> 使用 -mno-ms-bitfields 进行编译有帮助!上面的代码确实是正确的。有必要告诉mingw使用gcc的位域组织而不是微软的风格。虽然那时代码可能无法用微软编译器编译,但我现在不在乎。
根据GCC 手册的示例,attribute应该位于结构体的字段之后,即:
// PC Code
typedef struct
{
uint8_t var1;
uint16_t var2;
} __attribute__((packed, aligned(1))) FILE;
Run Code Online (Sandbox Code Playgroud)
我还删除了无意义的结构标记 ( _file)。
上面有一个我快速测试时sizeof的值。3