我是靠谱客的博主 简单电话,这篇文章主要介绍linux下的ktime_t timeval timespec,现在分享给大家,希望可以做个参考。

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

ktime_t

复制代码
1
2
3
4
Nanosecond//纳秒 /* Nanosecond scalar representation for kernel time values */ typedef s64 ktime_t;

ktime_t n等于n纳秒

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

复制代码
1
2
3
4
5
6
7
8
9
10
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; }

 类似的函数

复制代码
1
2
3
4
5
6
7
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; }
复制代码
1
2
3
4
5
6
7
8
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

复制代码
1
2
3
4
5
6
7
8
9
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

复制代码
1
2
3
4
struct timeval { __kernel_time_t tv_sec; /* seconds */ __kernel_suseconds_t tv_usec; /* microseconds */微秒 };
复制代码
1
2
3
4
5
6
7
8
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

复制代码
1
2
3
4
5
6
7
#ifndef _STRUCT_TIMESPEC #define _STRUCT_TIMESPEC struct timespec { __kernel_time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; #endif
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
/* 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)

获取内核启动总时间

复制代码
1
2
3
4
5
6
7
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);

测量时间流逝

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#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内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部