Linux内核时间函数

110阅读 0评论2025-01-24 13814089327
分类:LINUX

与时间有关的宏

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 的关系

jiffies 与秒的转换

与时间有关的数据结构

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_get_boottime是用于获取自系统启动以来时间的函数,考虑系统的睡眠状态。

ktime_t ktime_get_boottime(void)

返回参数:


总的来说,
ktime_getktime_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);
上一篇:Linux内核休眠唤醒流程
下一篇:Linux高分辨率定时器