1.问题描述
在IAR+ARM cortex A7的环境下,需要按照非4字节对齐方式访问结构体成员,其中结构体定义如下:
#pragma pack(1) //强制使用1字节对齐
typedef struct
{
unsigned int a;
unsigned short b;
unsigned int c;
}DATA_1;
#pragma pack() //恢复默认对齐方式
对结构体类型DATA_1执行sizeof(DATA_1)操作,发现其大小已变为10字节,而非按照4字节对齐的12字节。说明 #pragma pack(1)已生效;
但是,当执行如下代码中的赋值语句时,程序将进入非对齐异常(Alignment Fault):
DATA_1 data1;
int dataR=10;
memcpy(&data1.c,&dataR,sizeof(int));
int temp=data1.c; //此处赋值语句将进入异常
2.问题原因及解决办法
通过查询IAR官方帮助手册,发现问题的原因是编译器未使能非对齐访问。所以,若需要使用非4字节对齐则需要在编译器设置时添加
“–no_unaligned_access”选项,如下图所示。
千万别被这个选项的字面意思误导,实际意义以官方文档的说明为准!
千万别被这个选项的字面意思误导,实际意义以官方文档的说明为准!
千万别被这个选项的字面意思误导,实际意义以官方文档的说明为准!
重要的事情说三遍!
官方文档中的说明内容如下。注意:该选项仅支持ARMv6及以上的架构。