keil ARM MDK 中关于浮点协处理器VFP设定
0赞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=vfpv2 汇编开关: --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, 舍入到最近, 无异常. 和标准C和C++兼容。是默认模式。
正常有限值按照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。
