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



    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
  • 相关阅读:
    第二次作业
    第一次作业
    新博客用户·
    李秋红130705010066
    李秋红130705010066
    李秋红130705010066
    李秋红130705010066
    李秋红130705010066
    第五次作业
    第四次作业
  • 原文地址:https://www.cnblogs.com/flyinggod/p/13713183.html
Copyright © 2020-2023  润新知