一、 kernel中获取系统时间API:
函数实现:
kernel/time/timekeeping.c 中实现了几个常用API:

void ktime_get_ts64(struct timespec64 *ts)//CLOCK_MONOTONIC
void ktime_get_real_ts64(struct timespec64 *)//CLOCK_REALTIME
void ktime_get_boottime_ts64(struct timespec64 *)//CLOCK_BOOTTIME
void ktime_get_raw_ts64(struct timespec64 *)//CLOCK_MONOTONIC_RAW 

以上 4 个 API 实际上表明 Linux 提供了 4 种时间:

  • CLOCK_REALTIME:以 1970年1月1日… 为起点,随 time-of-day 被修改的时候而改变(例如,NTP网络时间协议)
  • CLOCK_MONOTONIC:从某个时间点开始的绝对逝去时间,不受任何系统time-of-day时钟修改的影响,在没有机器重启的情况下,若你想计算出两个事件发生的间隔时间的话,那么它将是最好的选择。但是 CLOCK_MONOTONIC 在系统 suspend 时并不会增长。
  • CLOCK_BOOTTIME:以系统启动时间为起点,在系统suspend的时候时钟依然增长。
  • CLOCK_MONOTONIC_RAW:与 CLOCK_MONOTONIC 相似,虽然 CLOCK_MONOTONIC 不受 NTP 的影响,但是随着 NTP 了解本地振荡器和上游服务器之间存在错误时,它的频率确实会发生变化,而 CLOCK_MONOTONIC_RAW 完全取决于本地振荡器。

结构体 struct timespec64 定义在 include/linux/time64.h 文件:

struct timespec64 {
        time64_t        tv_sec;     /* seconds */
        long            tv_nsec;    /* nanoseconds */
};

该文件还包含一些对struct timespec64类型结构体变量的处理API:如下
timespec64_sub 计算时间差,返回同样类型的结构体变量
timespec64_to_ns 用于将转换成ns值,返回值为u64类型

二、 测量某段代码执行时间

#include <linux/timex.h> 

struct timespec64 ts_start, ts_end;
struct timespec64 ts_delta;

ktime_get_boottime_ts64(&ts_start);
// ...要计算执行时间的函数逻辑
ktime_get_boottime_ts64(&ts_end);

// 计算时间差
ts_delta = timespec64_sub(ts_end, ts_start);

pr_notice("[DB] time consumed: %lld (ns)\n",timespec64_to_ns(&ts_delta));
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐