OK6410A 开发板 (七) 7 buildroot-2021.02 OK6410A 用户空间的浮点处理过程

从一个示例开始
https://blog.csdn.net/u011011827/article/details/117488268
从这篇文章中的例子可以看出
-mfloat-abi=aaa 来指定浮点运算处理方式
-mfpu=bbb来指定浮点协处理的类型
aaa 可取 soft softfp hard
bbb 可取 vfp neon vfpv3 vfpv4 vfpv3-d16 vfpv4-d16

-mfloat-abi=soft	// -msoft-float 与 -mfloat-abi 功能类似
	// 用cpu寄存器(不用vfp寄存器),将除0 在用户空间用 浮点软件库 实现
	// 有没有fpu都不会陷入异常
	// gcc 用的 软件浮点库实现 为 mpfr // The MPFR library is a C library for multiple-precision floating-point computations with correct rounding. 
-mfloat-abi=softfp
	// 用cpu寄存器(不用vfp寄存器),用vfp指令
	// 有fpu,直接执行指令 没有fpu,陷入未定义指令异常,可在异常中模拟该指令
-mfloat-abi=hard
	// 用vfp寄存器,用vfp指令
	// 有fpu,直接执行指令 没有fpu,陷入未定义指令异常,可在异常中模拟该指令

代码有没有使用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 编译
	// softfp eabi 和 soft eabi 两者在gnu都被称为是 标准eabi, 即gnueabi

	// https://blog.csdn.net/qwaszx523/article/details/56484929

level1
  • 定点与浮点
https://blog.csdn.net/k331922164/article/details/75579230
定点与浮点是指计算机存储数字的格式,跟人们日常使用的数字有很大区别。

而定点与浮点在《计算机组成原理》有很详细的说明,但是电子专业的学生只学《单片机》,而《单片机》并没有介绍定点与浮点的内容,所以电子专业的学生缺了这点基础,导致在FPGA处理运算时遇到拦路虎。
  • FPU的使用

https://blog.csdn.net/yuanlu837/article/details/7742324

没找到 armv6 的 fpu指令封装库,找到了 cortex-m 的 fpu指令封装库
	单片机的浮点库介绍 : https://blog.csdn.net/Mculover666/article/details/117518734
	单片机的浮点库 : qfplib-m3 https://download.csdn.net/download/dengbin2010/10638747

  • 浮点定点化
gcc 的浮点库 : MPFR
level2
  • arm的两种cc怎么处理浮点
https://blog.csdn.net/hunanchenxingyu/article/details/47003279
处理两个问题:
	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://blog.csdn.net/skyflying2012/article/details/45113193
	menu "Floating point emulation"
	有fpu要屏蔽 浮点异常 , 不然遇到fpu指令还是会产生 浮点异常 ?
	没有fpu,要配置浮点异常,不然遇到fpu指令产生异常无法处理
ABI
  • 由软硬浮点导致的ABI问题
https://blog.csdn.net/yuanlu837/article/details/7746274
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


  • 当前系统的 ABI标准
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://blog.csdn.net/remme123/article/details/47857727
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值