软件环境:vivado 2017.4 硬件平台:XC7Z020
好久都没更了,这次居然更个简单的,有点太不好意思了。怎么讲呢,虽然简单,但是也很实用好吧。在linux下,如果想知道一段程序、一个算法、一次通讯的时间,可以用gettimeofday(),那么就自然而然想到,如果程序裸跑在SDK下,有没有类似的函数,可以知道程序运行时间呢,然后找了找资料,也实验了下,最后在这里总结如下,工程用最简的工程就行。
主要还是在SDK这边,使用的函数是 XTime_GetTime(),使用前需包含头文件。
#include "xtime_l.h"
这里新建一个helloworld工程来说明一下使用方法。
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "sleep.h"
#include "xtime_l.h"
int main()
{
u64 time_begin,time_end;
long int time_dif;
int i = 0;
long sum = 0;
float time_cost;
print("Delay 2s\n");
XTime_GetTime(&time_begin);
sleep(2);
XTime_GetTime(&time_end);
time_dif = time_end - time_begin;
printf("2s timer count is %ld,1s timer count is %d\n",time_dif,COUNTS_PER_SECOND);
print("\n");
print("for-circle begin\n");
XTime_GetTime(&time_begin);
for(i = 0;i < 1000; i++)
sum = sum + 1;
XTime_GetTime(&time_end);
time_dif = time_end - time_begin;
time_cost = (float)(time_dif)/COUNTS_PER_SECOND;
printf("for-circle cost time count %ld,Equivalent to %f s\n",time_dif,time_cost);
print("\n");
init_platform();
print("Hello World\n\r");
cleanup_platform();
return 0;
}
将待测程序段夹在两个XTime_GetTime()之间,分别将起始时间与待测程序运行结束时间赋给两个变量,变量值之差即为待测程序运行时间。要说明的是,这里由XTime_GetTime()得到的值为定时器的计数值,并不是实际的运行时间,实际的运行时间还需要除以1s计数值得基准值。
程序的上半部分以sleep 2s为例,得到sleep 2s的计数值,并一同输出1s计数的基准值,COUNTS_PER_SECOND中保存的就是1s计数的基准值,从结果可以看到,确实为近似2倍的关系。程序的下半部分实测了for循环求和1000次所需要的时间,这里将时间的计数值除以基准值,得到实际的运行时间,并由浮点型显示,约为14 us。
2020-07-28更新 昨天有个资料忘了贴了,今天补上。
是这样子的,从上面的结果图里可以看到,1s的计数基准值是333_333_343,这个数字有没有什么讲究呢,其实是有的,ug585手册,239页有说,定时器的频率是系统时钟频率的二分之一。