我是靠谱客的博主 简单电话,最近开发中收集的这篇文章主要介绍linux下的ktime_t timeval timespec,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

内核中,经常看到ktime_t变量,总结下

ktime_t

 Nanosecond//纳秒
/* Nanosecond scalar representation for kernel time values */
typedef s64	ktime_t;

ktime_t n等于n纳秒

有ms/ns转换成ns的两个函数,是不是很简单

static inline ktime_t ns_to_ktime(u64 ns)
{
	return ns;
}

static inline ktime_t ms_to_ktime(u64 ms)
{
	return ms * NSEC_PER_MSEC;
}

 类似的函数

static inline ktime_t ktime_set(const s64 secs, const unsigned long nsecs)
{
	if (unlikely(secs >= KTIME_SEC_MAX))
		return KTIME_MAX;

	return secs * NSEC_PER_SEC + (s64)nsecs;
}
include/linux/time64.h
#define MSEC_PER_SEC    1000L
#define USEC_PER_MSEC   1000L
#define NSEC_PER_USEC   1000L
#define NSEC_PER_MSEC   1000000L
#define USEC_PER_SEC    1000000L
#define NSEC_PER_SEC    1000000000L
#define FSEC_PER_SEC    1000000000000000LL

反过来,ktime_t转换成us/ms

static inline s64 ktime_to_us(const ktime_t kt)
{
	return ktime_divns(kt, NSEC_PER_USEC);
}

static inline s64 ktime_to_ms(const ktime_t kt)
{
	return ktime_divns(kt, NSEC_PER_MSEC);
}

timeval

struct timeval {
        __kernel_time_t         tv_sec;         /* seconds */
        __kernel_suseconds_t    tv_usec;        /* microseconds */微秒
};
void do_gettimeofday(struct timeval *tv)
{
	struct timespec64 now;

	getnstimeofday64(&now);
	tv->tv_sec = now.tv_sec;
	tv->tv_usec = now.tv_nsec/1000;
}

 timespec

#ifndef _STRUCT_TIMESPEC
#define _STRUCT_TIMESPEC
struct timespec {
        __kernel_time_t tv_sec;                 /* seconds */
        long            tv_nsec;                /* nanoseconds */
};
#endif
/* Map the ktime_t to timespec conversion to ns_to_timespec function */
#define ktime_to_timespec(kt)		ns_to_timespec((kt))

/* Map the ktime_t to timespec conversion to ns_to_timespec function */
#define ktime_to_timespec64(kt)		ns_to_timespec64((kt))

/* Map the ktime_t to timeval conversion to ns_to_timeval function */
#define ktime_to_timeval(kt)		ns_to_timeval((kt))

/* Convert ktime_t to nanoseconds - NOP in the scalar storage format: */
#define ktime_to_ns(kt)			(kt)

获取内核启动总时间

long long  s=0;
long long  ms=0;
ms=ktime_to_ms(ktime_get_boottime());
printk("boottime=%lld msn",ms);
s=ms/1000;
ms=ms%1000;
printk("boottime=%lld.%lld sn",s,ms);

测量时间流逝

#include<linux/module.h>
#include<linux/ktime.h>
#include<linux/delay.h>   

ktime_t time_start;
struct timeval tstart,tend;
s64 elapsed_ns=0;    
static int time_init(void)  
{  
	time_start=ktime_get();
	msleep(1);
	elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); 
	printk("%lld nsn",elapsed_ns);

	do_gettimeofday(&tstart);
	msleep(1);
	do_gettimeofday(&tend);
	printk("time taken: %ld millisecn",1000 * (tend.tv_sec - tstart.tv_sec) +(tend.tv_usec - tstart.tv_usec) / 1000);
	return 0;  
}  
      
static void time_exit(void)  
{  
	printk(KERN_INFO "%sn",__FUNCTION__);  
}  
      
module_init(time_init);  
module_exit(time_exit);
MODULE_LICENSE("GPL"); 

 

最后

以上就是简单电话为你收集整理的linux下的ktime_t timeval timespec的全部内容,希望文章能够帮你解决linux下的ktime_t timeval timespec所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部