Board logo

标题: [转]EDK中输出时间问题 [打印本页]

作者: pengpengpang    时间: 2015-4-21 20:03     标题: [转]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);
}





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0