前言,ARM编译器选项除了优化系统代码性能外,往往还具备其他一些设定,例如警告级别,和指令集的扩展
本文论述工作中遇到的一个编译开源浏览器chromine遇到的问题,由编译选项引发的可执行文件的Illegal instruction的错误
引子:
在使用海思的目标板的时候,用了之前的编译选项,如下:
-march=armv7-a -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon
结果发现编译没有问题,但是,运行的时候出现Illegal instruction
分析:
指令错误,一般是编译器选择错误,或者,编译参数选择错误。这次,完全是上一次的编译参数,编译器也说明了,一致,那么错在哪里呢?
难道是CPU的架构有点不同。
使用:
# cat /proc/cpuinfo
# cat /proc/cpuinfoprocessor : 0model name: xxxBogoMIPS : xxxFeatures : swp half thumb fastmult vfp edsp vfpv3 vfpv3d16 tlsCPU implementer : xxxCPU architecture: xxxCPU variant: xxxCPU part : xxxCPU revision : 1Hardware : xxxRevision : 0000Serial: 0000000000000000
我们看到
“Features : swp half thumb fastmult vfp edsp vfpv3 vfpv3d16 tls ”
在cat 出来的cpu的功能列表里面,有vfp等浮点功能,但是没有支持neon的多媒体增强模块,也就是,该款CPU,A9的选项里面是没有使能Neon的,
那么用这个指令优化编译出来的指令,执行起来,一旦执行相关的操作,必然导致,指令错误的报错了。这就是问题的根本所在。
结论
ARM CPU的NEON的功能,居然在这块CPU上是不存在的,-mfpu=neon 这个编译选项是错误的。会让软件尝试调用NEON指令。
TechnologiesThere are a common set of industry-leading technologies found across the entire range of ARM processors, including:The ARM Processor Architecturebig.LITTLE Processing DSP and SIMD extensions <span style="background-color: rgb(51, 255, 51);"><strong>NEON™ advanced SIMD instructions for efficient multimedia processing</strong></span>IEEE 754-compliant hardware floating point support (VFP)Hardware-accelerated Java support (Jazelle®)TrustZone® security extensionsVirtualization ExtensionsIn addition a range of Reference Methodologies for ARM processors is available. Reference Methodologies deliver a known level of performance, power efficiency and area for the processors based on specific EDA tools vendors and process geometries.
解决办法:
首先,我们应该知道,CPU的架构的不同到底会导致哪里的功能的缺少?
这一点,在我的另外一个博文里面有比较清楚的说明,后面,发现是系统运用的一个开源库skia的设定里面,默认是enable了Neon的功能。
解决的办法就是:在客户的gyp文件里面,定义arm_neon , 和arm_neon_optional 为0,这两个变量在skia里面被用来编译甄别是否使能了Neon,
如果芯片本身不支持Neon,那么disable这个功能是必须的。
Ref:
1ARM平台NEON指令的编译和优化
/mcu/article_071427550.html
2
/products/processors/technologies/index.php
3 ARM 架构核和体系结构关系图
/qa-215-170903.aspx
4[ARM] [基础][编译]ARM的浮点功能历史分类和对应的编译选项
/yellow_hill/article/details/52608989
5 一个比较清晰的NEON的视频,和编译器的设定
x-//11/27/arm-neon-tutorial-in-c-and-assembler/
6
http://www.add.ece.ufl.edu/4924/docs/arm/ARM%20NEON%20Development.pdf
本帖原创:
请保持本帖链接,并@
QQ:28044280