我是从一个PC(的mingw32,32位拱)上的嵌入式系统(STM32,凯尔的μ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个字节的填充。我怎样才能解决这个问题?
我固定它通过自己 - >与-mno-MS-位域编译帮助!上面的代码确实是正确的。有必要告诉MinGW的使用GCC的位域的组织,而不是微软的风格。尽管代码可以uncompileable与微软编译器的话,我不会在这一点不在乎。
据the GCC manual's examples,该attribute
应结构体的领域,即经过去:
// PC Code
typedef struct
{
uint8_t var1;
uint16_t var2;
} __attribute__((packed, aligned(1))) FILE;
我也放弃了无谓的结构标签(_file
)。
上述内容已经sizeof
的3
值时,我很快就进行了测试。
packed属性是broken on mingw32 compilers。另一种选择是使用pragma pack:
#pragma pack(1)
typedef struct _file
{
uint8_t var1;
uint16_t var2;
} FILE;
为什么不把结构要素按大小顺序呢?你就不需要担心填充字节。
// ARM Code
typedef struct _file
{
uint16_t var2;
uint8_t var1;
} FILE;
typedef struct _file
{
uint16_t var2;
uint8_t var1;
} FILE;