您好,欢迎来到61ic! | [登录] [注册] 忘记密码 | 设为首页 帮助
 . 网站首页 . 业界新闻 . 设计中心 . 移动技术 . TI专栏 . ADI专栏 . FPGA专栏 . 代码工厂 . 官方商城 . 
 . 活动专区 . 新品快递 . 解决方案 . 前沿科技 . TI资源 . ADI资源 . FPGA资源 . 下载中心 . 产品展示 . 
加入收藏
付款方式
联系我们
您现在的位置: 61IC电子在线 >> TI专栏 >> TI CCS >> 参考经验 >> 正文
  CCS上程序运行时间统计方法最终报告           ★★★ 【字体:
CCS上程序运行时间统计方法最终报告
作者:zzsfqiuy…    文章来源:zzsfqiuyigui    点击数:    更新时间:2013-4-17    

我在前一段时间写的博文《CCS3.3 利用profile对程序的运行时间进行统计》只是写了用CCS3.3上的profile进行时间剖析的不爽之处,得出profile不准确的结论,看到有同学转载俺的博文,俺很欣慰呀,不过请大家转载时务必写上俺的大名:baiguangyu0001白栎旸。

俗话说有破有立,这篇博文将给出一个测定程序运行时间的一种准确的方法。

不用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 cycle spended is %d/n",stop-start-substraction);

完成

但是,很可能这样做最后显示结果是0,这跟所使用的DSP芯片和开发板RTS有关,所以并不是所有人都能使用的。

(2)用片上的硬件定时器,最准确不过了。设置方法也很简单。如果你没有把片上的三个定时器全部用光的话,可以试试这种方法。下面的例子是以DM642芯片为例,跟其它芯片的主要区别是分频比不同而已,下文我会说到,这里使用timer0。

加头文件:csl_timer.h,加了这个头文件后,它会自动添加头文件csl_timerhal.h,

定义变量:句柄:TIMER_Handle hTimer0;
最终的循环数:unsigned int 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/n",(float)baitime*4/(3*100000000)); //将周期数转化成具体时间

由于C64 DSP的计数器时钟是CPU时钟的1/8,且我的DSP主频是600MHz,所以

具体时间=周期数/CPU主频/8,即为上面的式子,计算结果非常准确。

还有很多计数器函数写在:csl_timer.h和csl_timerhal.h里,可以在C:/CCStudio_v3.3/C6000/csl/include中找到他们,里面的函数都很有用的。大家自己看吧。

(3)使用DSP/BIOS。我点File----new-----DSP/BIOS configuration,弹出错误“unable to create bios config server”。DSP上BIOS下载俺不是很懂,网上也没有有参考价值的资料,希望各位高人指点一二。

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    CCS中使用DSP定时器的计时程…
    使用EMCV出现missing DW_AT_…
    使用EMCV将工程.c文件改为.c…
    CCS中头文件添加extern C { …
    CCS3.3编译链接库文件与头文…
    有符号数和无符号数的转换问…
    TMS320F28335在Flash里面运行…
    CCS中h文件如何加入
    CCS编译链接库文件与头文件
    将TI DSP的.out文件转换成数…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61 湘ICP备13001086号-2