600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > [ARM]【编译】【实践】 - 浮点编译选项NEON引发的Skia的库Illegal instruction运行错误和解决办法

[ARM]【编译】【实践】 - 浮点编译选项NEON引发的Skia的库Illegal instruction运行错误和解决办法

时间:2020-11-06 08:20:08

相关推荐

[ARM]【编译】【实践】 -  浮点编译选项NEON引发的Skia的库Illegal instruction运行错误和解决办法

前言,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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。