Linux驱动程序记录时间差的方法--jiffies和do_gettimeofday()区别。

Linux驱动程序记录时间差的方法

常用的Linux内核空间记录一个事务的时间差有两种方法–使用jiffies变量和do_gettimeofday()函数。这两天接到一个测量PCIe总线带宽的任务,使用芯片自带的PCIe 内部DMA读取PCIe地址空间的数据以测量PCIe的总线带宽,使用了两种测量DMA启动到DMA传输完成的时间差。

1. jiffies记录时间差的特点

使用jiffies较为简单,jiffies变量可以看成一个只读的跟随系统运行时间不断增长的计数器。他在文件中定义。使用时可以简单的使用如下方法。

#include 

u32 j1;
u32 j2;
u32 diff;
u32 diff_ms;

j1 = jiffies; //记录当前时间的jiffies
do_something_here(); //处理了一个事务
j2 = jiffies; //记录令以时刻的jiffies值
diff = j2 - j1;//计算jiffies的差值

diff_ms = jiffies_to_msecs(diff);//将差值转化为毫秒值

使用jiffies的方法较为简单,但是缺点是精确度不够。

2. do_gettimeofday()函数

do_gettimeofday()函数是gettimeofday()系统调用在内核的实现。该函数需要传入结构体timeval指针。

struct timeval
{
__time_t tv_sec;        /* Seconds. */
__suseconds_t tv_usec;  /* Us. */
}

其中的tv_sec存储秒数,而tv_usec则存储微秒数。常见用法为:

#include 

struct timeval t1;
struct timeval t2;

u64 diff_us;

do_gettimeofday(&t1);
do_something_here(); //处理了一个事务
do_gattimeofday(&t2);

diff_us = ((u64)t1.tv_usec - (u64)t2.tv_usec) * 1000000 + ((u64)t1.tv_usec - (u64)t2.tv_usec);

使用do_gettimeofday()函数需要注意timeval结构体的tv_usec成员的取值范围为0~10000000,以此表示tv_sec无法表示的微秒数。

你可能感兴趣的:(Linux设备驱动程序)