以经典的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。
再讲赋值改为浮点数据赋值:
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。
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
再来看浮点数加法,如下,就写一条
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里面千万不能直接做浮点运算,虽然可以算出来,但是特别耗费时间。
但是在定点DSP里面,可以对浮点数进行读取和赋值,这样在寄存器里面对赴定点数搬来搬去的,可以耗时稍微比搬运整形费时一点点。可以接受。
上面浮点数的运算,不管是算数运算还是逻辑运算,都是非常耗时的。