DSP

CCS上程序运行时间统计方法最终报告

2019-07-13 15:18发布

转载自:http://blog.sina.com.cn/s/blog_4c270c730100mkh1.html  我在前一段时间写的博文《CCS3.3 利用profile对程序的运行时间进行统计》只是写了用CCS3.3上的profile进行时间剖析的不爽之处,得出profile不准确的结论,看到有同学转载俺的博文,俺很欣慰呀,不过请大家转载时务必写上俺的大名:baiguangyu0001白栎旸,或直接在新浪上点转载即可。 俗话说有破有立,这篇博文将给出一个测定程序运行时间的一种准确的方法。首先,看看TI官方网站上TI员工的关于profile时间剖析器的一些解答:

  这两份回答说明CCS自带的profile在时间统计上是不精确的,而且是非常不精确的,至少在我用的CCS3.3上是这样。     不用profile的话,统计时间还有3种办法,(1)根据C6000编译手册上所说,使用clock()函数。(2)DSP/BIOS下的时间分析器。(3)使用DSP片上自带的时钟。     (1)clock()函数使用:要加头文件:time.h,并在菜单栏profile----clock------enable点击 使用时,先定义:clock_t start,stop,substraction;                 start=clock();                 stop=clock();                 substraction=stop-start; 然后:                   start=clock();             ..........要检测的程序段....................                stop=clock();                printf("the cyclespended is %d ",stop-start-substraction); 完成 但是,很可能这样做最后显示结果是0,这跟所使用的DSP芯片和开发板RTS有关,所以并不是所有人都能使用的。   (2)用片上的硬件定时器,最准确不过了。设置方法也很简单。如果你没有把片上的三个定时器全部用光的话,可以试试这种方法。下面的例子是以DM642芯片为例,跟其它芯片的主要区别是分频比不同而已,下文我会说到,这里使用timer0。     加头文件:csl_timer.h,加了这个头文件后,它会自动添加头文件csl_timerhal.h,     定义变量:句柄:TIMER_HandlehTimer0;
              最终的循环数:unsignedint baitime;               一个结构体: TIMER_Config baiConfig = {     TIMER_CTL_RMK   
    (   
        TIMER_CTL_SPND_EMUSTOP,   
        TIMER_CTL_INVINP_NO,            
        TIMER_CTL_CLKSRC_CPUOVR8,       
        TIMER_CTL_CP_PULSE,             
        TIMER_CTL_HLD_NO,            
        TIMER_CTL_GO_NO,            
                                       
        TIMER_CTL_PWID_TWO,           
                                        
        TIMER_CTL_DATOUT_1,             
        TIMER_CTL_INVOUT_YES,             
        TIMER_CTL_FUNC_TOUT            
    ),      
 0xffffffff,
 0x0
}; 这个结构体的很多语句都不重要,因为我们只是想用它的计时功能,什么中断呀,输入时钟,输出时钟,我们都不管,但要注意的其中: (一)、TIMER_CTL_CLKSRC_CPUOVR8,说明DM642计时器的频率是CPU频率的8分之1,只要是C64的DSP都是这样,其他DSP使用TIMER_CTL_CLKSRC_CPUOVR4, (二)、TIMER_CTL_HLD_NO,说明时钟有效 (三)、TIMER_CTL_GO_NO, 说明时钟虽然有效,但还没开启 (四)、0xffffffff,是时钟计时器想要达到的周期数,一旦计数器增加到这个数,时钟就启动中断程序了,但是我们只想计时,不想中断,当然要把它设置的越大越好,这里我把它设置为unsigned int的额定最大值。根据我的计算,它可以坚持57s不中断(对于600M主频的DSP)。如果你想检测的程序运行时间超过57s,那还是分段计时或改用其他方法统计时间吧。 (五)、0x0,这是计数器的初值,当然从0开始计时了,当然,你也可以写其他数。 这个结构体的其他选项就随便写吧。 接下来,调用一些程序: hTimer0 = TIMER_open(TIMER_DEV0,TIMER_OPEN_RESET);  //开启文件 TIMER_config(hTimer0,&baiConfig);  //把刚配置好的文件赋给hTimer0 TIMER_start(hTimer0);  //开始计时 ............要计时的程序段..................... baitime=TIMER_getCount(hTimer0);  //读取计数器中的周期数
TIMER_pause(hTimer0);       //停止计数
printf("the time spended is %fs ",(float)baitime*4/(3*100000000));//将周期数转化成具体时间 由于C64 DSP的计数器时钟是CPU时钟的1/8,且我的DSP主频是600MHz,所以 具体时间=周期数/CPU主频/8,即为上面的式子,计算结果非常准确。 还有很多计数器函数写在:csl_timer.h和csl_timerhal.h里,可以在C:CCStudio_v3.3C6000cslinclude中找到他们,里面的函数都很有用的。大家自己看吧。   (3)使用DSP/BIOS。我点File----new-----DSP/BIOS configuration,弹出错误“unable tocreate bios config server”。DSP上BIOS下载俺不是很懂,网上也没有有参考价值的资料,希望各位高人指点一二。