我正在尝试找到一种在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位边界上对齐打包变量?
此致
答案 0 :(得分:5)
如果你不介意:
typedef struct Struct_HdrPrefix{
uint8_t Prefix;
uint8_t dummy; // for alignment
uint16_t Type;
}__attribute((packed))Struct_HdrPrefix;
如果您想要打包结构和对齐字段,则没有其他方法。您必须手动对齐数据。您唯一的选择是将dummy
插入(以及有多少)。