首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[转]EDK中输出时间问题

[转]EDK中输出时间问题

在用EDK进行开发时,经常要对所写的算法程序性能进行评估,其中一项重要的评估指标:程序运行时间。
如果是用硬核PowerPC建立工程, 首先必须在程序中加入头文件,xparameters.h以及
xtime_l.h。xtime_l.h头文件中提供了诸如:XTime_GetTime (&time)、XTime_SetTime (t)等基本
函数。而xparameters.h头文件中定义了XPAR_CPU_PPC405_CORE_CLOCK_FREQ_HZ参
数。
如果是用软核MicroBlaze建立工程,首先必须在程序中加入头文件,xparameters.h以及

xtmrctr_l.h。xtmrctr_l.h头文件中提供了诸如:XTmrCtr_mGetTimerCounterReg、
XTmrCtr_mSetLoadReg、XTmrCtr_mSetControlStatusReg、XTmrCtr_mSetControlStatusReg
等基本函数。而xparameters.h头文件中定义了XPAR_CPU_CORE_CLOCK_FREQ_HZ参数。
(注意:PowerPC硬核本身有一个计数器,而Microblaze软核在建立工程时需加入一个计数器)
下面就两个简单的例子加以说明:(参考了官方文档)
例1:PowerPC下时间获取,单位秒(s)
#include "xparameters.h"
#include "xutil.h"
#include "stdio.h"
#include "xtime_l.h"

u32 get_timer ();
void set_timer (u32 time);
float conv_cycles_to_secs (u32 cycles);

int main( int argc, char** argv )
{
u32 ts;
set_timer(0);
……………………

…………………… //自己的程序部分
……………………
ts = get_timer();
printf ("The total time is\t: %f S.\r\n",conv_cycles_to_secs(ts));

return 0;
}

u32 get_timer ()
{
XTime time;
XTime_GetTime (&time);
return (u32) time;
}

void set_timer (u32 time)
{
XTime t;
t = (XTime)time;
XTime_SetTime (t);
}

float conv_cycles_to_secs (u32 cycles)
{
return ((float)cycles / XPAR_CPU_PPC405_CORE_CLOCK_FREQ_HZ);
}

例2:MicroBlaze时间获取,单位秒(s)
#include "xparameters.h"
#include "xutil.h"
#include "stdio.h"
#include “xtmrctr_l.h”

#define SYSTEM_TIMER_BASEADDR XPAR_OPB_TIMER_0_BASEADDR
/* (EDK 10.1下,该语句有所变化:
#define SYSTEM_TIMER_BASEADDR XPAR_XPS_TIMER_0_BASEADDR) */
int init_timer ();
u32 get_timer ();
void set_timer (u32 time);
float conv_cycles_to_secs (u32 cycles);

int main( int argc, char** argv )
{
u32 ts;

init_timer ();
set_timer(0);
……………………

…………………… //自己的程序部分
……………………
ts = get_timer();
printf ("The total time is\t: %f S.\r\n",conv_cycles_to_secs(ts));

return 0;
}

int init_timer ()
{
/* Set load value = 0, Load timer, clear interrupt bit, start the timer */
XTmrCtr_mSetLoadReg(SYSTEM_TIMER_BASEADDR, 0, 0);
XTmrCtr_mSetControlStatusReg(SYSTEM_TIMER_BASEADDR, 0,
XTC_CSR_INT_OCCURED_MASK
| XTC_CSR_LOAD_MASK);
XTmrCtr_mSetControlStatusReg(SYSTEM_TIMER_BASEADDR, 0,
XTC_CSR_ENABLE_TMR_MASK
| XTC_CSR_AUTO_RELOAD_MASK);
}

u32 get_timer ()
{
return XTmrCtr_mGetTimerCounterReg(SYSTEM_TIMER_BASEADDR, 0);
}

void set_timer (u32 time)
{
/* Set load value = 0, Load timer, clear interrupt bit, start the timer */
XTmrCtr_mSetLoadReg(SYSTEM_TIMER_BASEADDR, 0, time);
XTmrCtr_mSetControlStatusReg(SYSTEM_TIMER_BASEADDR, 0,
XTC_CSR_INT_OCCURED_MASK
| XTC_CSR_LOAD_MASK);
XTmrCtr_mSetControlStatusReg(SYSTEM_TIMER_BASEADDR, 0,
XTC_CSR_ENABLE_TMR_MASK
| XTC_CSR_AUTO_RELOAD_MASK);
}

float conv_cycles_to_secs (u32 cycles)
{
return ((float)cycles / XPAR_CPU_CORE_CLOCK_FREQ_HZ);
}
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表