【问题标题】:nanoseconds from clock_gettime() on mips routermips 路由器上 clock_gettime() 的纳秒
【发布时间】:2016-12-06 02:44:03
【问题描述】:

我正在尝试在 1GHz MIPS 路由器上从 CLOCK_REALTIME 获得纳秒分辨率。当我为 x86 编译以下代码并在 1GHz vm 上运行时,我得到了纳秒级分辨率。当我针对 mips 进行编译并在 1GHz 路由器上运行时,它似乎可以精确到微秒。

#include <stdio.h>
#include <time.h>

int main(int argc, char **argv, char **arge) {
  struct timespec tps, tpe;
  if ((clock_gettime(CLOCK_REALTIME, &tps) != 0)
      || (clock_gettime(CLOCK_REALTIME, &tpe) != 0)) {
    perror("clock_gettime");
    return -1;
  }
  printf("%lu s, %lu ns\n", tpe.tv_sec-tps.tv_sec,
     tpe.tv_nsec-tps.tv_nsec);
  return 0;
}

这里是采样时间:

vagrant@vagrant-ubuntu-trusty-64:~$ gcc clock.c -o clock_x86 -static -lrt
vagrant@vagrant-ubuntu-trusty-64:~$ ./clock_x86
0 s, 221 ns


vagrant@vagrant-ubuntu-trusty-64:~$ mipsel-openwrt-linux-gcc clock.c -lrt -static -o clock_mips
<...scp...>
root@OpenWrt:~# ./clock_mips
0 s, 3000 ns

我对时钟、MIPS、处理器等有什么误解吗?无论处理器架构如何,我都希望调用 CLOCK_REALTIME 以产生纳秒级粒度/分辨率。

此外,如果有人能阐明这些 POSIX 计时器是如何实现的以及它们是如何获得测量值的,我将不胜感激。

【问题讨论】:

    标签: c posix mips timing time.h


    【解决方案1】:

    时钟的保证粒度在POSIX.1-2008 中指定为至少20ms。这是密切相关的 sn-p:

    CLOCK_REALTIME 和 CLOCK_MONOTONIC 时钟以及基于这些时钟的所有时间服务的最大允许分辨率由 {_POSIX_CLOCKRES_MIN} 表示,并且应定义为 20 毫秒(1/50 秒)。实现可以支持这些时钟的较小分辨率值,以提供更精细的时基粒度。特定时钟的实现支持的实际分辨率是使用clock_getres() 函数获得的。如果基于这些时钟之一的时间服务支持的实际分辨率与该时钟支持的分辨率不同,则实现应记录此差异。

    基本上,您需要调用clock_getres() 来确定实现指定的分辨率实际上是什么。不要做任何假设它比 20 毫秒更细的事情。

    【讨论】:

    • 这有帮助。当您提到“实现指定”时,您指的是内核吗?也就是说,如果我需要更好的分辨率,我是否应该专注于寻找以不同方式实现这些计时器的内核?
    【解决方案2】:

    clock_gettime 支持的最小分辨率为纳秒。但不能保证系统时钟的分辨率(或该功能的实现)会高于或低于此值。

    拨打clock_getres查询时钟分辨率。

    【讨论】:

      猜你喜欢
      • 2012-12-06
      • 2023-04-07
      • 1970-01-01
      • 2011-06-12
      • 2019-11-30
      • 1970-01-01
      • 2011-05-17
      • 2015-02-27
      • 1970-01-01
      相关资源
      最近更新 更多