以经典的F28035为例,对于习惯了浮点DSP的朋友来说,用定点DSP,刚开会感觉很烦人,算个数特别麻烦。特别是经常要计算小数,也就是浮点数,例如3.14*3.22,这样的计算在浮点DSP里面不是事儿,很快,但是在定点dsp里面,仅仅这个简单的乘法,就好消耗2us的时间,这样想完成一定功能的计算,那时间消耗多得让控制功能无法实现。

F28035系统时钟定位60M,  周期为16.67s

但是如果在定点DSP里面进行浮点数的读取和赋值呢?这个会不会消耗很多时间呢?

       下面对一些列的情况做实验来具体看看,以加深印象。

        实验思路是,通过置低,置高IO口,在这个置低置高之间插入语句,通过示波器看低电平确定语句执行时间。

大概形式如下:

volatile float      f32Temp    = 0.45785;
volatile float      f32Temp1   = 235435.544;
volatile Uint32     u32CNTemp  = 3454324;
volatile Uint32     u32CNTemp1 = 1234556;

void main(void)
{
    Chipinit();
	while(1)
    {
	    GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //1
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //2
        u32CNTemp = u32CNTemp1;  u32CNTemp = u32CNTemp1;  
        u32CNTemp = u32CNTemp1;  u32CNTemp = u32CNTemp1;   u32CNTemp = u32CNTemp1;
        GpioDataRegs.GPASET.bit.GPIO28 = 1;
    }
}

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //1
        GpioDataRegs.GPASET.bit.GPIO28 = 1;这两句话,对应下面第一个低电平,时间为118ns

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //2
        u32CNTemp = u32CNTemp1;  u32CNTemp = u32CNTemp1;  u32CNTemp = u32CNTemp1;  u32CNTemp = u32CNTemp1;   u32CNTemp = u32CNTemp1;
        GpioDataRegs.GPASET.bit.GPIO28 = 1;这段话对应下面第二个低电平,时间为300ns,中间执行了五条整形赋值语句,300-118=182,182/5 = 36.4ns, 36.4/16.666667=2.18个系统时钟周期,

即一条整形赋值语句耗费2sysclk。

定点DSP的浮点数操作耗时实验_算法

再讲赋值改为浮点数据赋值:
 

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //1
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //3
        f32Temp = f32Temp1;  f32Temp = f32Temp1;   f32Temp = f32Temp1;   f32Temp =                  f32Temp1;     f32Temp = f32Temp1;
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

下图是五条浮点数赋值的情况,第二个低电平时间为400ns,282/5=56.4ns,56.4/16.6667=3.38

即执行一条浮点数的赋值语句耗时大概3个sysclk。

定点DSP的浮点数操作耗时实验_赋值_02

	    GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //1
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //4
        u32CNTemp = u32CNTemp1 + u32CNTemp;  
        u32CNTemp = u32CNTemp1 + u32CNTemp;   u32CNTemp = u32CNTemp1 + u32CNTemp;   
        u32CNTemp = u32CNTemp1 + u32CNTemp;    u32CNTemp = u32CNTemp1 + u32CNTemp;
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

再看上面的整形数加法,下面第二个电平可以看出,一条整数加法大概3个sysclk

定点DSP的浮点数操作耗时实验_浮点数_03

再来看浮点数加法,如下,就写一条

	    GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //1
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //5
        f32Temp = f32Temp + f32Temp1;
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

下图第二个低电平时间为3.3us,即执行浮点加法:f32Temp = f32Temp + f32Temp1;耗费的时间3us以上。
 

定点DSP的浮点数操作耗时实验_浮点数_04

 所以,在定点dsp里面千万不能直接做浮点运算,虽然可以算出来,但是特别耗费时间。

但是在定点DSP里面,可以对浮点数进行读取和赋值,这样在寄存器里面对赴定点数搬来搬去的,可以耗时稍微比搬运整形费时一点点。可以接受。

上面浮点数的运算,不管是算数运算还是逻辑运算,都是非常耗时的。