3

我正在尝试找到一种使用 GCC 将 32 位或 16 位键上的变量对齐的好方法。

我正在研究不支持未对齐数据访问的 Cortex-M0。我在使用时遇到了这个问题-Os。我使用 arm-none-eabi 版本 4.6.2。我有这个小测试用例:

#include "stdint.h"

typedef struct Struct_HdrPrefix{
    uint8_t Prefix;
    uint16_t Type;
}__attribute((packed))Struct_HdrPrefix;

volatile Struct_HdrPrefix test;
volatile Struct_HdrPrefix test1;

int main(void)
{
    test.Type = 0;
    while(1)
        __asm("nop");
}

void HardFault_Handler(void)
{
    while(1)
        __asm("nop");
}

当我编译这个时,我得到一个非对齐的变量测试。

这是地图文件中的结果:

COMMON         0x20000000        0x6 ./SRC/main.o
               0x20000000                test1
               0x20000003                test

所以现在我遇到了硬故障。如果我将其添加到变量中:

volatile Struct_HdrPrefix test __attribute((aligned (4)));
volatile Struct_HdrPrefix test1 __attribute((aligned (4)));

由于test现在已对齐,因此按预期工作。

我不能在结构上使用 align 属性,因为这个结构也可能是另一个包装的一部分。

有没有办法告诉 GCC 或 LD 在 32 位边界上对齐打包变量?

问候

4

1 回答 1

5

如果你不介意:

typedef struct Struct_HdrPrefix{
    uint8_t Prefix;
    uint8_t dummy; // for alignment
    uint16_t Type;
}__attribute((packed))Struct_HdrPrefix;

如果您想要打包结构和对齐字段,则没有其他方法。您必须手动对齐数据。您唯一的选择是插入的位置dummy(以及插入的数量)。

于 2013-04-15T17:11:42.093 回答