HI3516的编译参数-mcpu=cortex-a7、-mfloat-abi=softfp和-mfpu=neon-vfpv4


原文链接: HI3516的编译参数-mcpu=cortex-a7、-mfloat-abi=softfp和-mfpu=neon-vfpv4

HI3516的编译参数-mcpu=cortex-a7、-mfloat-abi=softfp和-mfpu=neon-vfpv4_嵌入式_llljjlj的博客-CSDN博客

前言
Hi3516A具有浮点运算单元和neon。文件系统中的库是采用软浮点和neon编译而成,因此所有Hi3516A板端代码编译时需要在Makefile里面添加选项-mcpu=cortex-a7、-mfloat-abi=softfp和-mfpu=neon-vfpv4。

-mfloat-abi=softfp
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)中。

自动向量化选项
armcc编译器使用–vectorize选项来使能向量化编译,一般选择更高的优化等级如-O2或者-O3就能使能–vectorize选项。

gcc编译器的向量化选项-ftree-vectorize来使能向量化选项,使用-O3会自动使能-ftree-vectorize选项。

-mcpu=cortex-a7
选择处理器类型
armcc编译器使–cpu 7-A或者–cpu Cortex-A8来指定指令集架构和CPU类型。

gcc编译器的处理器选项-mfpu=neon和-mcpu来指定cpu类型。如-mcpu=cortex-a5

选择NEON和VFP类型
gcc选择用-mfpu=vfpv3-fp16来指定为vfp协处理,而-mfpu=neon-vfpv4等就能指定为NEON+VFP结构。

选择浮点处理器和ABI接口类型
-mfloat-abi=soft使用软件浮点库,不是用VFP或者NEON指令;-mfloat-abi=softfp使用软件浮点的调用规则,而可以使用VFP和NEON指令,编译的目标代码和软件浮点库链接使用;

-mfloat-abi=hard使用VFP和NEON指令,并且改变ABI调用规则来产生更有效率的代码,如用vfp寄存器来进行浮点数据的参数传递,从而减少NEON寄存器和ARM寄存器的拷贝。

常用的CPU类型编译器选项

Cortex-A5

-mcpu=cortex-a5

-mfpu=vfpv3-fp16

-mfpu=vfpv3-d16-fp16

-mfpu=neon-fp16

-d16表明只有前16个浮点寄存器可用

Cortex-A7

-mcpu=cortex-a7

-mfpu=vfpv4

-mfpu=vfpv4-d16

-mfpu=neon-vfpv4

-fp16表明支持16bit半精度浮点操作

Cortex-A8

-mcpu=cortex-a8

-mfpu=vfpv3

-mfpu=neon

Cortex-A9

-mcpu=cortex-a9

-mfpu=vfpv3-fp16

-mfpu=vfpv3-d16-fp16

-mfpu=neon-fp16

Cortex-A15

-mcpu=cortex-a15

-mfpu=vfpv4

-mfpu=neon-vfpv4

确认处理器是否支持NEON
cat /proc/cpuinfo

看是否有如下内容

Features : swp half thumb fastmult vfp edsp neon vfpv3 tlsvfpv4 idiva idivt

`