Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1807952
  • 博文数量: 195
  • 博客积分: 4227
  • 博客等级: 上校
  • 技术积分: 2835
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-04 10:39
文章分类

全部博文(195)

文章存档

2013年(1)

2012年(26)

2011年(168)

分类: C/C++

2012-06-04 21:03:26

利用TSCL和TSCH来计算时钟周期,这两天看了一下如何他们

DSP开发,测量某个函数或某段代码的cycles消耗是经常要做的 事情,常用的profiling和clock()一般在simulation下使用,真正到了板子上做emulation时,因为要考虑到数据和被测 code在板子上的存放位置和读取时间,用这种方法测结果就不那么可靠了。其实在c64x+ core上有两个计数寄存器TSCL/TSCH,它们与CPU同频,共同表示一个64-bit数,CPU运行一个cycle,该寄存器就加1,因此可以用 它们来准确的测量cpu在某个执行段中消耗的cycles。一般我们只会用到TSCL这个寄存器,594MHz下,32-bit可以测试到7s,而 TSCH是高32位,除非测试整个工程,一般用不到它。

使用方法:长时间宽范围时钟测定

unsigned long long t1,t2;

t1=_itoll(TSCH,TSCL);

code_wait_test;

t2=_itoll(TSCH,TSCL);

printf(“#cycle=%d”,t2-t1);

短时间(7秒)窄范围时钟测定:

T1=TSCL;

…process code …

T2=TSCL;

Printf(“#cycle=%d”,t2-t1);

方法二,也可以采用biosAPI方式

LgUns time1=CLK_gethtime();

…process code …

LgUns time2=CLK_gethtime();

Cpucycles=(time2-time1)*CLK_cpucyclePerhtime;

Prinf(“#cycle=%d”,Cpucycle);

关于测量CPU时钟周期中我们用的变量类型和函数我们都可以在C6000DSP/bios的API文档和BIOS提供的源码找到,可以详细去查阅。

#include "c6x.h"


void YourFunc (void)
{
unsigned long long start;
unsigned long long end;

start = _itoll (TSCH, TSCL);

/* put your code here */

end = _itoll (TSCH, TSCL);

printf ("Hi mate, I just wasted %d DSP-cycles in your punny code.
Optimize me!\n", end-start);
}

inline long long read_time(void)
{
extern cregister volatile unsigned int TSCL;
extern cregister volatile unsigned int TSCH;
long long l = (TSCH << 32) | TSCL;
return l;
}
在使用TSCL和TSCH时首先需要向TSCL中写入数据,使能TSC寄存器。
在DSP手册中说明:
The counter is enabled by writing to TSCL. The value written is ignored.
阅读(7305) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~