Chinaunix首页 | 论坛 | 博客
  • 博客访问: 345692
  • 博文数量: 110
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 859
  • 用 户 组: 普通用户
  • 注册时间: 2018-10-15 14:13
个人简介

搭建一个和linux开发者知识共享和学习的平台

文章分类

全部博文(110)

文章存档

2025年(9)

2024年(15)

2023年(24)

2022年(27)

2019年(8)

2018年(27)

分类: LINUX

2025-01-24 14:25:09

与时间有关的宏

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;

参数:

  • tv: 高精度时间值,单位通常是纳秒

timespec 和 timespec64

timespec 和 timespec64 都是在 Linux 内核中用于表示时间的结构体。timespec用在32位系统上, timespec64 用在64位系统上,以支持更大的时间范围和更好的兼容性。


struct
 timespec {
     __kernel_old_time_t     tv_sec;         /* seconds */
     long                    tv_nsec;        /* nanoseconds */
};

参数说明:

  • tv_sec: 秒
  • tv_nsec:纳秒
struct timespec64 {
    time_t tv_sec;  // 秒
    long   tv_nsec; // 纳秒
};

参数说明:

  • tv_sec: 秒
  • tv_nsec:纳秒
时间函数的常用API

ktime_to_ms是用于将 ktime_t 类型的时间值转换为毫秒的函数
s64 ktime_to_ms(const ktime_t kt)

参数说明:

  • kt: 获取一个 ktime_t 类型的时间值

返回值:

  • 返回一个s64类型的ms整数值

ktime_get 是 Linux 内核中用于获取高精度ns为单位时间戳的函数,它通常用于实时性要求较高的情境。

ktime_t ktime_get(void);

返回参数:

  • ktime_t : 用于表示高精度的时间值。它是一个整型数据类型,通常用于跟踪和表示时间的纳秒级分辨率。

ktime_get_boottime是用于获取自系统启动以来时间的函数,考虑系统的睡眠状态。

ktime_t ktime_get_boottime(void)

返回参数:

  • ktime_t : 用于表示高精度的时间值。它是一个整型数据类型,通常用于跟踪和表示时间的纳秒级分辨率。

总的来说,
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);
阅读(76) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~