arm中关于非内存对齐访问的问题

蜗牛世家 2020-04-13 04:08:55
#pragma pack(push,1)
typedef struct
{
unsigned short it;
float f;
} OUTDATA;
#pragma pack(pop)

OUTDATA *p_out;//当前值

float GetInFloat(int cc)
{
float f=1.23;
return f;
}

int CalculateF(float *data)
{
*data = GetInFloat(0); //arm中该方式会触发SIGBUS信号,Alignment trap(访问非对齐内存空间出错)
return 1;
}
int main(int argc, char *argv[])
{
p_out=new OUTDATA;
memset(p_out,0,sizeof(OUTDATA));

CalculateF(&p_out->f);

return 0;
}

上面代码有问题,因为data地址除以4除不整,会报下面的错误Alignment trap: not handling instruction edc37a00 at [<0001061c>]
Unhandled fault: alignment exception (0x801) at 0x0119500a
pgd = 8a7dc000
[0119500a] *pgd=8a6c8831, *pte=8c5be75f, *ppte=8c5bec7f
Bus error

但是如果把所有的float换成int就可以,但是换成int之后,data的地址还是不能整除4却可以成功。
如果不把float改成int,把*data=GetInFloat(0)直接换成*data=1.23也是正确的,很无语,不知为why
...全文
575 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
silent_world 2020-04-23
  • 打赏
  • 举报
回复
检查一下三个地方: 1、mcu是32位,还是多少位的?仅仅是调用GetInFloat时,涉及到float的进栈和出栈。 2、编译器的选项,是否使用地址自动对齐? 3、对float的支持,是软支持还是硬支持,如果软支持,编译器地址自动对齐选项是否一致。
蜗牛世家 2020-04-23
  • 打赏
  • 举报
回复
引用 1 楼 silent_world 的回复:
检查一下三个地方: 1、mcu是32位,还是多少位的?仅仅是调用GetInFloat时,涉及到float的进栈和出栈。 2、编译器的选项,是否使用地址自动对齐? 3、对float的支持,是软支持还是硬支持,如果软支持,编译器地址自动对齐选项是否一致。
感谢回复,我这个是ARM v7 32位的,编译器支持自动处理字节对齐,对float软支持还是硬支持我也不清楚,我把*data=GetInFloat(0)换成 float *test;test=GetInFloat(0);*data=*test;这样转一下也是可以得,暂时先这样了。很郁闷,后面有时间再从汇编指令着手,看看为啥不行

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧