学习链接:
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 <linux/timer.h>
#include <linux/timex.h>
#include <linux/rtc.h>
/*添加到合适位置*/
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);
有不合适之处请指正