从一个示例开始
https:
从这篇文章中的例子可以看出
-mfloat-abi=aaa 来指定浮点运算处理方式
-mfpu=bbb来指定浮点协处理的类型
aaa 可取 soft softfp hard
bbb 可取 vfp neon vfpv3 vfpv4 vfpv3-d16 vfpv4-d16
-mfloat-abi=soft
-mfloat-abi=softfp
-mfloat-abi=hard
代码有没有使用vfp 取决于编译过程
下一步可能是
1.fpu指令的执行
2.浮点软件库的执行
3.未定义指令异常
其实最本质的原因,是要处理浮点运算 ,我们将浮点运算分层
level1 : VFP 和 浮点定点化
level2 : arm-gcc 对 level1的封装(封装了用VFP还是 浮点定点化,并引出了一个新问题,在这一层用arm寄存器传参还是vfp寄存器传参)
但是,在一个系统上,只能存在一种处理方式.(用VFP还是用浮点定点化,vfp寄存器传参)
如果用vfp寄存器,VFP, 那么就是 hardfp 标准, 即 hardfp eabi , 用 gnueabihf-gcc 编译
如果用arm寄存器,VFP, 那么就是 softfp 标准, 即 softfp eabi , 用 gnueabi-gcc 编译
如果用arm寄存器,浮点定点化, 那么就是 soft 标准, 即 soft eabi , 用 gnueabi-gcc 编译
level1
https:
定点与浮点是指计算机存储数字的格式,跟人们日常使用的数字有很大区别。
而定点与浮点在《计算机组成原理》有很详细的说明,但是电子专业的学生只学《单片机》,而《单片机》并没有介绍定点与浮点的内容,所以电子专业的学生缺了这点基础,导致在FPGA处理运算时遇到拦路虎。
https:
没找到 armv6 的 fpu指令封装库,找到了 cortex-m 的 fpu指令封装库
单片机的浮点库介绍 : https:
单片机的浮点库 : qfplib-m3 https:
gcc 的浮点库 : MPFR
level2
https:
处理两个问题:
1. 用VFP还是 浮点定点化
2. 用arm寄存器传参还是vfp寄存器传参
1. 有 vfp
1. 使用arm/vfp 寄存器, 使用 vfp硬件, 直接运行 vfp指令,正常运行
2. 使用arm 寄存器, 使用 浮点定点化库, 直接运行 IA32指令,正常运行
2. 无 vfp
1. 使用arm/vfp 寄存器, 使用 vfp硬件, 直接运行 vfp指令,产生异常,异常处理程序中用 浮点定点化库 处理(运行IA32指令,正常运行),异常处理完就返回
2. 使用arm 寄存器, 使用 浮点定点化库, 直接运行 IA32指令,正常运行
未定义指令异常下linux的处理 : https:
menu "Floating point emulation"
有fpu要屏蔽 浮点异常 , 不然遇到fpu指令还是会产生 浮点异常 ?
没有fpu,要配置浮点异常,不然遇到fpu指令产生异常无法处理
ABI
https:
ABI即“application binary interface”,即编译器将c代码编译成汇编代码时使用的一种规则
使用规范如下:
在编译带有浮点参数的函数时,有三种可能的编译选项:
-mfloat-abi=soft
-mfloat-abi=softfp
-mfloat-abi=hard
"soft"选项:表明不使用FPU硬件,而是使用GCC的整数算术运算来模拟浮点运算。
"softfp"选项:表明要使用FPU硬件来做浮点运算,只是,函数的参数传递到整数寄存器(r0-r3)中,然后再传递到FPU中。
"hard"选项:表明要使用FPU硬件来做浮点运算,并且,函数的参数直接传递到FPU的寄存器(s0、d0)中。
hardfp ABI和hardfloat运算不是一回事:
hardfp ABI也称为VFP模式的ABI;只是一种编译规则;而hardfloat运算则表示用FPU来做浮点运算。
soft ABI和softfp ABI这两者统称为标准模式ABI。
因此,在涉及到浮点函数调用时,
用-mfloat-abi=soft编译的app或者库,在用-mfloat-abi=softfp编译的OS中是可以跑的;
用-mfloat-abi=softfp编译的app或者库,在用-mfloat-abi=soft编译的OS中,如果SoC中没有FPU,那么是不能跑的。
而-mfloat-abi=softfp/soft与-mfloat-abi=hard,是互不兼容的。
注意,Code sourcery 2007/2008均不支持-mfloat-abi=hard,从Code Sourcery 2009q1才开始支持-mfloat-abi=hard,
即arm-none-linux-gnueabi-gcc-4.3.2以后的版本支持-mfloat-abi=hard
pi@raspberrypi:~$ readelf -A /proc/self/exe | grep Tag_ABI_VFP_args
Tag_ABI_VFP_args: VFP registers
如果找到Tag_ABI_VFP_args标签,那么你是在一个armhf系统上运行。如果没有返回,那么它是armel。
- 如何确认 一个elf 文件 使用的是硬件浮点还是软件浮点
https: