结构包装和使用MinGW对齐

问题描述 投票:5回答:4

我是从一个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个字节的填充。我怎样才能解决这个问题?

c arm mingw32 stm32
4个回答
4
投票

我固定它通过自己 - >与-mno-MS-位域编译帮助!上面的代码确实是正确的。有必要告诉MinGW的使用GCC的位域的组织,而不是微软的风格。尽管代码可以uncompileable与微软编译器的话,我不会在这一点不在乎。


1
投票

the GCC manual's examples,该attribute应结构体的领域,即经过去:

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

我也放弃了无谓的结构标签(_file)。

上述内容已经sizeof3值时,我很快就进行了测试。


1
投票

packed属性是broken on mingw32 compilers。另一种选择是使用pragma pack

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

0
投票

为什么不把结构要素按大小顺序呢?你就不需要担心填充字节。

// ARM Code
typedef struct _file
{
    uint16_t var2;
    uint8_t var1;
} FILE;

typedef struct _file
{
    uint16_t var2;
    uint8_t var1;
} FILE;
© www.soinside.com 2019 - 2024. All rights reserved.