概述
内核中,经常看到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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复