ARMClang6.1编译优化导致的访问不对齐异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARMClang6.1编译优化导致的访问不对齐异常相关的知识,希望对你有一定的参考价值。

大家好:
我用Altera SOC,ARM cortex-A9核,裸跑。系统启动时配置SCTLR.A(-Alignment check enable)为disable,但运行编译优化时库函数出现数据不对齐异常(data abort exception).原因是:编译器将for(i=0;i<6;i++)*dptr++=*sptr++的6字节数据拷贝优化成 __aeabi_memcpy库函数,由于源数据不是4字节对齐,所以库函数异常。请问大家有什么办法吗?编译优化设置为O1,
我采用ARM公司的DS-5,貌似armclang编译器的库函数_aeabi_memcpy无法处理不对齐访问,如果CPU不支持不对齐访问,其结果是崩溃。问题是,如果显示调用memcpy可以自己改写,但象使用for循环这种复制少量数据有被编译器优化调用_aeabi_memcpy导致的问题如何处理?如何才能避免编译器做这种优化,代码都是多年成熟代码,总不能去修改所有代码吧???

参考技术A keil-project-options for target-选项卡c/c++ 左侧中间有个optimization 后面的对应的就是编译优化设置 level 0就是不优化 参考技术B ARM7、ARM9和ARM11的区别 ARM处理器解析

ARM7是冯诺依慢结构,三级流水线结构
ARM9、ARM11是哈佛结构,5级流水线结构,所以性能要高一点。
ARM9和ARM11大多带内存管理器,跑操作系统好一点,ARM7适合裸奔。

以上是关于ARMClang6.1编译优化导致的访问不对齐异常的主要内容,如果未能解决你的问题,请参考以下文章

JVM C1 编译优化:空检查擦除

ARMv8:EL3 中未对齐的 LDR 导致异常数据中止

C++ volatile关键字(多线程中声明为易变值不稳定值,告诉程序每次都从内存读取,不被编译优化,防止被优化后变量异常)

非对齐访问和Alignment Fault

如何防止因编译器开启优化,而导致程序执行错误

内存对齐问题