voidXTime_SetTime(XTime Xtime)和voidXTime_GetTime(XTime *Xtime)的使用
这两个函数是standalone_v1_00_a提供的,可以在standalone_v1_00_a->xtime_l.c中找到这两个函数。
使用这两个函数可以测出程序使用的时钟周期数,对于我们分析程序的性能很有帮助。
下面是函数的源码。
/****************************************************************************
*
* Set the time in the Time Base Register
*
* @param Value to be written to the Time Base Register
*
* @return None.
*
* @note None.
*
*
****************************************************************************/
voidXTime_SetTime(XTime Xtime)
{
mtspr(XREG_SPR_TBL_WRITE, 0);/* set TBL to 0 to avoid ripple */
mtspr(XREG_SPR_TBU_WRITE, (unsignedint) (Xtime >> 32));/* set TBU */
mtspr(XREG_SPR_TBL_WRITE, (unsignedint) Xtime);/* set TBL */
}
/****************************************************************************
*
* Get the time from the Time Base Register
*
* @param Pointer to the location to be updated with the time
*
* @return None.
*
* @note None.
*
*
****************************************************************************/
voidXTime_GetTime(XTime *Xtime)
{
unsignedinthigh;
unsignedintlow;
/* loop until we got a consistent register pair */
do
{
high = mfspr(XREG_SPR_TBU_READ);
low = mfspr(XREG_SPR_TBL_READ);
}while(high != mfspr(XREG_SPR_TBU_READ));
*Xtime = (((XTime) high) <
}
/****************************************************************************
PPC中有一个64位的timer,其实就是一个计数器,每一个时钟计数加一。
使用之前当然是先将计数器设置为0,所以用XTime_SetTime(0),
当在某个时刻需要得到计数器的值时,就调用XTime_GetTime(XTime *Xtime),其实这个函数从源码来看很好理解。主要是XTime这个数据类型是怎样的。
在xtime_l.h中,typedefunsignedlonglongXTime;
也就是说在SDK中unsigned long long就是64位的。
刚开始我还以为long就是64位的,结果发现还是32位的。
但是我写了如下程序:
XTime tmp_time;
tmp_time=0x1100110011001100;
编译之后出现警告,integer constant is too large for 'long'。
但是下载调试查看变量发现是没问题的,再搜了一下,Xilinx的论坛上那些人说这个warning没问题,可以不管。
但是问题来了,我要怎么printf这个XTime类型的值?
试了一下,用printf(“%llu”,tmp_time);可以做到。
写一个完整的小程序:
#include"xtime_l.h"
#include"stdio.h"
intmain()
{ XTime tmp_time;
XTime *n_clk;
XTime_SetTime(0);
;
;
;
XTime_GetTime(n_clk);
tmp_time = *n_clk;
printf("%llu",tmp_time);
return0;
}
EDK\doc\usenglish\oslib_rm.pdf里面有很多函数的说明。