与时间有关的宏
HZ 代表kernel的系统时钟每秒的产生的中断次数,例如 HZ 为250时,每秒的节拍数是250jiffies, 也就是每秒系统时钟产生中断的间隔则是1/250s 即 4ms。其定义位于kernel/include/asm-generic/param.h如下
define HZ CONFIG_HZ /* Internal kernel timer frequency */
可见HZ 由 CONFIG_HZ 定义,但是 CONFIG_HZ 则是编译内核时自动生成的,可以从.config 中找到具体的值
两个时间差
#define ktime_sub(lhs, rhs) ((lhs) - (rhs))
两个时间和
#define ktime_add(lhs, rhs) ((lhs) + (rhs))
与时间有关的变量
jiffies 是一个重要的全局变量,用于表示系统启动后的“时钟滴答”数量。jiffies 是一个无符号长整型变量,当jiffies的值超过它的{BANNED}最佳大存放范围后就会发生溢出, 对于32位无符号长整型,{BANNED}最佳大取值为(2^32)-1,即429496795。如果节拍计数达到了{BANNED}最佳大值后还要继续增加,它的值就会回绕到0。
HZ与 jiffies 的关系
-
如果是 100 Hz,jiffies 每秒增加 100。
-
如果是 1000 Hz,jiffies 每秒增加 1000。
jiffies 与秒的转换
-
将 jiffies转换为秒,可采用公式:(jiffies/HZ) 计算。
-
将秒转换为jiffies,可采用公式:(seconds*HZ) 计算。
与时间有关的数据结构
ktime_t
ktime_t 是 Linux 内核中的一个数据类型,用于表示高精度的时间值。它是一个整型数据类型,通常用于跟踪和表示时间的纳秒级分辨率。
typedef struct {
__u64 tv;
} ktime_t;
参数:
timespec 和 timespec64
timespec 和 timespec64 都是在 Linux 内核中用于表示时间的结构体。timespec用在32位系统上, timespec64 用在64位系统上,以支持更大的时间范围和更好的兼容性。
struct timespec {
__kernel_old_time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
参数说明:
struct timespec64 {
time_t tv_sec; // 秒
long tv_nsec; // 纳秒
};
参数说明:
时间函数的常用API
ktime_to_ms是用于将 ktime_t 类型的时间值转换为毫秒的函数
s64 ktime_to_ms(const ktime_t kt)
参数说明:
返回值:
ktime_get 是 Linux 内核中用于获取高精度ns为单位时间戳的函数,它通常用于实时性要求较高的情境。
ktime_t ktime_get(void);
返回参数:
-
ktime_t : 用于表示高精度的时间值。它是一个整型数据类型,通常用于跟踪和表示时间的纳秒级分辨率。
ktime_get_boottime是用于获取自系统启动以来时间的函数,考虑系统的睡眠状态。
ktime_t ktime_get_boottime(void)
返回参数:
-
ktime_t : 用于表示高精度的时间值。它是一个整型数据类型,通常用于跟踪和表示时间的纳秒级分辨率。
总的来说,ktime_get比ktime_get_boottime计算某段代码执行时间更精确
示例代码:
ktime_t start, end, elapsed;
unsigned int elapsed_msecs;
start = ktime_get();
msleep(1000);//计算某段代码经历多长时间
end = ktime_get();
elapsed = ktime_sub(end, start);
elapsed_msecs = ktime_to_ms(elapsed);
printk(KERN_INFO "(elapsed %d.%03d seconds)", elapsed_msecs / 1000, elapsed_msecs % 1000);