floor与ceil函数都是C语言的标准库函数,在头文件引用之后一般即可直接调用。在浮点DSP上,通过TI 的FastFPU库,此类浮点函数一般可以通过查ROM的方法快速计算得到。但在定点的DSP,比如C2000中常用的TMS320F2812上,则需做一定的处理,以提高执行效率。我们知道,在浮点DSP上一般有专门的浮点协处理器FPU来完成浮点运算,而在定点DSP上直接计算浮点运算需要消耗大量的处理能力,将浮点运算转换为定点来计算是唯一的选择。
在一个用到floor与ceil函数的具体实验中,我采用了TI公司的TMS320F2812定点DSP,采用C语言编程并使用TI公司定点处理智能数学运算(IQmath)。以对Vrab求取floor与ceil值为例,得到以下代码
/*floor and ceil calculation*/
_iq Uab,temp;
Uint16 fab,cab;
if(Uab>=0) {
fab=_IQint(Uab);
temp=_IQfrac(Uab);
cab=(temp||0)+fab;
}
else{
cab=_IQint(Uab);
fab=cab-1;
}
经测试,若采用C语言的标准库函数ceil与floor,计算六次floor与ceil与值需要耗费4118个时钟周期,而改写之后,求取六个值只需要137个周期,大大节省了计算时间;以DSP的时钟周期为例,则执行时间从4118*6.67ns=27.47us,缩短到了137*6.67ns=0.91us,运算速度得到极大的提高。
在此,顺便讲一下CCS中如何计算程序的执行时间:
首先是打开ccs,建立工程,编译程序,解决错误。。。这个过程不多讲,最后自然是下载程序。
其次,在ccs的工具栏中点击Profile---Clock---View,就可以在ccs的左下角看到时钟周期数了。。然后还需要再来一遍Profile---Clock---Enable,则使能了时钟评估这个选项。
其次,在需要被测试的程序两端加入断点,然后运行程序。。程序运行到第一个端点停止后,双击一下右下角的计数值,则它就能清零了。然后再运行一下程序,此时程序运行到第二个端点停止,这时的右下角的数值就是执行这段程序所用的时钟周期数。当然,考虑上插入断点所带来的处理器开销,实际的执行时钟周期要稍微小于所显示的值。