CMake: (一) arm浮点编译参数

  [TOC]

ABI和EABI

ABI(Application BinaryInterface), EABI(Embeded application Binary Interface),即编译器将C代码编译成汇编代码时使用的一种规则。一般包括

  1. C类型的表示(int, short,long, union…)
  2. 调用约定,包括如何传递参数和返回值;使用寄存器和堆栈。

ARM浮点运算

硬浮点

  编译器将代码直接编译成硬件浮点协处理器(浮点运算单元FPU)能识别的指令,这些指令在执行的时候ARM核直接把它转给协处理器执行。FPU 通常有一套额外的寄存器来完成浮点参数传递和运算。使用实际的硬件浮点运算单元(FPU)会带来性能的提升。
  使用硬浮点时,需要给编译器传递-mfpu-mfloat-abi参数,让编译器编译出硬件浮点单元(fpu)处理器能识别的指令

软浮点

  编译器把浮点运算转成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。如果系统没有任何浮点处理器单元,使用hard-float就会产生非法指令和异常。因而一般的系统镜像都采用软浮点以兼容没有VFP的处理器。

编译参数

-march=armv7

arm处理器每个核使用不同的arm体系结构版本,每个版本对应的指令集也可能不同;编译优化时可能根据架构指令集不同进行不同的优化。所以选哟指定编译时arm架构(即代码要运行的架构),

-mfloat-abi=soft/softfp/hard

  1. soft(软浮点):表明不是用FPU硬件,使用GCC整数算术库来模拟浮点运算
  2. softfp(硬浮点):表明要使用FPU硬件来做浮点运算,函数的参数传递到整数寄存器(r0-r3)中,然后再传递到FPU。目的是为了生成的代码采用兼容软浮点调用接口(即使用-mfloat-abi=soft时的调用接口),这样带来的好处是:兼容性和灵活性。

实际也可以这样应用:库可以采用-mfloat-abi=soft编译,而关键的应用程序可以采用-mfloat-abi=softfp来编译。

  1. hard(硬浮点):表明要使用FPU硬件来做浮点运算,并且函数的参数直接传递到FPU的寄存器(s0、d0)。这样要求所有库和应用程序必须采用这同一个参数来编译,否则连接时会出现接口不兼容错误.

注意
-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,是互不兼容的。

Armv7系列基本都有硬浮点,所以一般都选择softfp的方式。

-mfpu=neon-vfpv4

  参数-mfpu就是用来指定要产生哪种硬件浮点运算指令。常用的有vfpv3,vfpv4,neon等,hi3536 A17支持的是neon+vfpv4相结合的结构。


参考

  1. coolice87
posted @ 2020-09-22 16:51  采男孩的小蘑菇  阅读(2058)  评论(0编辑  收藏  举报