博客首页 | 排行榜 |

ican的博客

个人档案
博文分类
[转]EDK中输出时间问题  2010-11-14 11:58

 在用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);
}

类别:EDK |
上一篇:Xilinx IP核 license 申请方法 | 下一篇:“好人”怎么变成“好男人”
以下网友评论只代表其个人观点,不代表本网站的观点或立场