在GCC下与Cortex-M0进行可变对齐

时间:2013-04-15 17:02:59

标签: c gcc linker alignment cortex-m

我正在尝试找到一种在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

所以现在我遇到了严厉的错误。如果我将此添加到vars:

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

由于test现已对齐,因此预期正常工作。

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

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

此致

1 个答案:

答案 0 :(得分:5)

如果你不介意:

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

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