linux kernel 获取时间函数api

学习链接:

https://www.kernel.org/doc/html/latest/core-api/timekeeping.html

 

最近在学习内核获取时间api函数随手挑了几个记录下方便以后用,如下:

内核态常用获取纳秒的函数。u64是unsigned long long类型的数据类型,打印用%llu。

基本的基于时间的接口:

ktime_t ktime_get(void)// 用于可靠的时间戳和精确测量短时间间隔。在系统启动时启动,但在挂起期间停止

ktime_t ktime_get_boottime(void)//类似于ktime_get,但是但在挂起时不会停止例如,这可用于需要通过挂起操作与其他计算机同步的密钥过期时间。

ktime_t ktime_get_real(void)//返回相对于1970年的时间,类似于用户态的gettimeofday.这适用于需要在重新启动期间保持的所有时间戳,如inode时间,但在内部使用时应避免使用,因为它可能由于从用户空间执行的闰秒更新、NTP adjustment settimeofday()操作而向后跳转

ktime_t ktime_get_raw(void)//类似于ktime_get,但运行速度与硬件时钟源相同,而不需要(NTP)调整时钟漂移。这在内核中也很少需要。

根据用户的要求,有一些变量以不同的格式返回时间:

u64 ktime_get_ns(void)

u64 ktime_get_boottime_ns(void)

u64 ktime_get_real_ns(void)

u64 ktime_get_clocktai_ns(void)

u64 ktime_get_raw_ns(void)

 

time64_t ktime_get_seconds(void)

time64_t ktime_get_boottime_seconds(void)

time64_t ktime_get_real_seconds(void)

time64_t ktime_get_clocktai_seconds(void)

time64_t ktime_get_raw_seconds(void)

 

计算程序的运行时间:

 unsigned long old_tns, old_ts,now_ns, now_ts;

       old_ns= ktime_get();    

{

程序段

}
now_ns= ktime_get();
时间差 diff = now_ns -old_ns;

另外还有一个宏做除法

比如需要打印时间戳时

old_ns= ktime_get();    

old_ts = do_div(old_ns, 1000000000);//宏做除法运算  old_ns 保留剩余的ns ,ts秒数

printk("time [%05lu:%06lu]----------- \n",old_ts, (old_ns/1000));//  (old_ns/1000) 是微秒   -----------》可以打印时间戳

注意:多核使用情况,如果你发现时间t1超前与t2,说明是多核影响的。

 

#include
#include
#include

/*添加到合适位置*/

struct timex  txc;
struct rtc_time tm;
do_gettimeofday(&(txc.time));
rtc_time_to_tm(txc.time.tv_sec,&tm);
printk(“UTC time :%d-%d-%d %d:%d:%d /n”,tm.tm_year+1900,tm.tm_mon, tm.tm_mday,tm.tm_hour,tm.tm_min,tm.tm_sec);

 

 

有不合适之处请指正

你可能感兴趣的:(Linux内核)