方法:IAR+ARM cortex A7出现非对齐异常(Alignment Fault)的解决办法

本文讲述了在IAR编译环境下,如何处理因使用#pragmapack(1)导致的非4字节对齐访问结构体异常,并揭示了解决方案——在编译时添加--no_unaligned_access选项以启用非对齐访问。重要的是,选项含义并非字面意思,务必参考官方文档。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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及以上的架构。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weekman93

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值