有时候拿到一个库文件,可能会编译出错,遇到uses VFP register arguments 'xxx' does not的情况,表明我们使用的浮点参数和库文件所用的浮点参数不一致。

浮点运算理解

我们经常在IDE工具Build选项中可以看到硬件浮点和软件浮点。

  • 硬件浮点(hard-float)

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

  • 软件浮点(soft-float)

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

两者差异:软件浮点是通过浮点库去实现浮点运算的,效率低;硬件浮点是通过浮点运算单元来完成的,效率高。

uses VFP register arguments 'xxx' does not

uses VFP register arguments 'xxx' does not的原因如下: 该错误表明使用了不正确或不支持的VFP(virtual float point)浮点运算方式。

  1. 不支持的VFP编译:MCU不支持VFP(hard)计算;
  2. 不一致的VFP编译:链接所用的LIB和我们工程用的浮点参数不一致。

解决方案

  • 方案1

检查APP的编译选项CFLAGS的VFP的计算类型: FABI := hard //这里把hard改为softfp CFLAGS += -mfloat-abi=$(FABI)

  • 方案2

重编译Lib库,CFLAGS中添加或修改-mfloat-abi=hard(须和APP中编译选项一致)。