hebut971372

keil ARM MDK 中关于浮点协处理器VFP设定

0
阅读(8740)

1 VFP 支持

ARM VFP 协处理器对硬件浮点处理做了优化极少出现的算术运算或者太复杂的运算不在硬件里处理必须通过软件处理这样可以减少协处理器硬件需求,降低成本.

VFP支持代码是用来处理VFP硬件不能处理的情况的。如果VFP硬件不能直接处理某种情形,跳到支持代码做更多的处理。例如,以下情形就会调用支持代码。

围绕 NaNs的浮点操作

围绕低于正常值的浮点操作.

上溢

下溢

不精确结果

0错误

无效操作

当支持代码到位。VFP完全兼容IEEE754浮点模式。


2 keil软件中关于floating point hardware的设定

Not used : 代码的产生不使用任何VFP指令。编译开关:none 汇编开关:none

 

Library calls: 编译产生库调用,库使用VFP指令。(产生典型的最新代码量。选择thumb模式时应该使用。)编译开关: --fpu=softvfp+vfpv2, 汇编开关: --fpu=vfpv2

 

in-line (strict ANSI): 编译大部分使用vfp单元内联代码。(按照ANSI标准产生快速代码)。编译开关: --fpu=vfpv汇编开关: --fpu=vfpv2

 

in-line (fast): 编译全部使用vfp单元内联代码。(错误检测不总是符合ANSI标准)。编译开关: --fpu=vfpv2 --fpmode=fast, 汇编开关: --fpu=vfpv2

 

--fpu name

none:选择无浮点结构。可以汇编符合任何fpu的目标文件。--device指定。

vfpv2选择符合vfpv2结构的硬浮点单元。

softvfp选择软件浮点链接包。这是没有选择--fpu选项并且device选项不符合特定FPU的默认值。

softvfp+vfpv2 :选择使用VfP指令的软件浮点库作为浮点库。

3 参数解释

--fpmode=model

指定浮点模式设定库属性和浮点优化性能。 汇编器中选项有以下几种。

ieee_full 

完全兼容IEEE标准模式。单双精度操作和性能由标准保证。需要异常陷阱和支持代码。

这种模式定义如下符号:

__FP_IEEE

__FP_FENV_EXCEPTIONS

__FP_FENV_ROUNDING

__FP_INEXACT_EXCEPTION

 

ieee_fixed 

带舍入到最近并且不带不精确异常的IEEE 标准。

定义如下符号:

__FP_IEEE

__FP_FENV_EXCEPTIONS

 

ieee_no_fenv 

带舍入到最近并且不带异常的IEEE 标准。这种模式符合java浮点运算模式。

定义如下符号:

__FP_IEEE.

std 

IEEE 小于正常的有限值释放到0舍入到最近无异常和标准CC++兼容。是默认模式。 

正常有限值按照IEEE标准处理。

§ NaNs 和无穷大可能不会按照IEEE模式在所有情形下产生。如果产生,也可能有不同的标记。

§ 0标记可能不是按照IEEE模式预测。

fast 

通过浮点优化可以进一步提升性能。带来精度微小损失的同时,可以获得性能的大幅提升。这种模式定义符号 __FP_FAST.

这种选项的结果导致并不完全兼容 ISO C  C++ 标准然而数据鲁棒的浮点程序可以工作正常。

这种模式可能引起转换,包括:

§ 如果浮点参数都能用单精度值精确表示,双精度数学函数可能转换为单精度函数。结果也就立即转换为单精度值。这种转换只有在所选的库中包含相当的单精度函数时才进行。例如,选择rvct库。

float f(float a)

{

    return sqrt(a);

}

转换为:

float f(float a)

{

    return sqrtf(a);

}.

§ float y = (float)(x + 1.0) 转换为 float y = (float)x + 1.0f.

§ 被浮点除转换为乘倒数 x / 3.0 转换为 x * (1.0 / 3.0).

§ 调用数学函数后,不保证 errno  值兼容ISO C  C++ 标准 。允许编译器内联平方根函数sqrt()  sqrtf()到调用位置.

汇编器模式有如下几种:

ieee_full 

全兼容IEEE754模式 .

ieee_fixed 

舍入到最近并且不带不精确异常的IEEE 标准。 

ieee_no_fenv 

舍入到最近并且不带异常的IEEE 标准。 兼容java浮点模式.

std 

与编译器同。

fast 

对一些值进行优化牺牲部分精度换取执行速度。不是IEEE兼容的,也不是标准C。