[资料分享] C28x+FPU架构的CPU和CLA的差异及误差处理技巧

Aguilera   2019-12-10 21:43 楼主

      C28x+FPU架构的C2000微处理器在原有的C28x定点CPU的基础上加入了一些寄存器和指令,来支持IEEE 单精度浮点数的运算。对于在定点微处理器上编写的程序,浮点C2000也完全兼容,不需要对程序做出改动。浮点处理器相对于定点处理器有如下好处:

  1. 编程更简单
  2. 性能更优,比如除法,开方,FFT和IIR滤波等算法运算效率更高。
  3. 程序鲁棒性更强。

一、IEEE754格式的浮点数

C28x+FPU的单精度浮点数遵循IEEE754格式。它包括:

  • 1位符号位:0表示正数,1表示负数。
  • 8位阶码
  • 23位尾数

image.png
标准数据格式和特殊值,比如非数值(NaN)和无穷大(1)非规格化数值非常小,计算公式为(-1)sx2(E-126)x0.M

(2)正常范围数值计算公式为(-1)sx2(E-127)x1.M

正常范围数值落在± ~1.7 x 10 -38 to ± ~3.4 x 10 +38范围内。从表1可以看出,IEEE754标准包括:

  • 标准舍入模式和浮点运算
  • 多平台支持,包括德州仪器C67x系列芯片。

C2000对该标准作了一些简化:

  • 状态标志位和比较运算不区分正0和负0
  • 非规格化数值被认为是0
  • 对非数值(NaN)处理方式和无穷大一样。

IEEE754标准有5种舍入模式,C28x+FPU只支持其中两种:

--截断:小数位不管大小全部舍去

--就近舍入向偶舍入:这种模式下如果小数位小于5就舍去,大于5就进位,如果小数位为5,则舍入到最近的偶数。

表2展示了不同的舍入模式对数据的影响。C28x+FPU编译器默认将微处理器配置为就近舍入向偶舍入模式[1]

表2:不同舍入模式示例

image.png


二、浮点C2000芯片运算技巧和注意点  

浮点数的精度由尾数位决定,绝大多数的数在用浮点数表示时都会有误差,这些误差很小,多数情况下可以忽略,但是在经过多次计算后这个误差可能会大到无法接受。

下面用实例来进行说明,下面一段代码定义float类型变量,分别在TI最新的Delfino芯片F28379D的CPU1和CLA1上,将11.7加20001次。

float CLATMPDATA=0;

int index=20001;

   while(index--)

   {

       CLATMPDATA=CLATMPDATA+11.7;

}

 

为何CPU和CLA计算结果不同?

CPU和CLA运算结果的不同是由于其对浮点数的舍入模式的不同造成的,前文已经说过,C28x+FPU 编译器默认将CPU配置为就近舍入向偶舍入模式。而CLA不同,CLA默认为截断舍入模式[2]。在CLA的代码中,我们可以通过增加下述代码:

__asm(" MSETFLG RNDF32=1");//1为就近舍入向偶舍入,0为截断舍入

将CLA的舍入模式更改为就近舍入向偶舍入模式,然后再运行代码,可以得到和CPU同样的结果。

 

本帖最后由 Aguilera 于 2019-12-10 21:44 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复