【问题标题】:How to implement a clock in c similar to linux system clock如何在c中实现一个类似于linux系统时钟的时钟
【发布时间】:2014-09-30 13:45:33
【问题描述】:

通常,当 linux 系统启动时,它实际上会从 RTC 获取参考时间并自行运行软件计时器 [即,通常称为系统时钟/挂钟]。当系统即将关闭时,它会将其挂钟时间与 RTC 同步。我正在寻找一种在 c 中实现挂钟的方法,类似于此。任何机构都可以为我提出一些想法吗?

提前致谢,

阿南达克里希南拉马萨米。

【问题讨论】:

  • 阅读 C 定时器函数(getitimersetitimertimer_createtimer_gettimetimer_settime 等...)。
  • 用户空间的所有计时方法都依赖于内核提供的时间函数。

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

操作系统通常会从 RTC 或 HPET 或任何其他计时器设备获取系统启动时间。并且在它们加载 PIC 或 APIC 的值以接收来自它们的周期性中断(例如每 100 毫秒之后)。根据这些中断更新系统时钟或挂钟的值。

【讨论】:

    【解决方案2】:

    如果不依赖操作系统提供的功能,您无法在纯 C 语言中执行此操作。原因是操作系统通过多道程序调度了多个应用程序,而您的 C 应用程序无法知道它何时被调度程序挂起。

    因此,您必须使用 gettimeofday()time() 等 Posix 函数。

    【讨论】:

      【解决方案3】:

      很难做到 100% 正确。您必须检测 CPU 进入睡眠状态的时间、系统是否挂起,以及任何人更改时区的时间,或者夏令时开始或结束的时间。你必须自己做所有这些事情。

      今天所有的 CPU 都有一个高分辨率计时器。它只是一个增加每个 CPU 时钟周期的寄存器。如果您知道 CPU 的频率,并且您定期读取该寄存器(例如,经常读取它不会溢出),您就可以测量时间。

      在 linux 上,有一系列函数可以为您读取此寄存器,计算 CPU 频率,并以纳秒为单位返回该寄存器中的时间:

      timespec ts;
      clock_gettime( CLOCK_MONOTONIC_RAW, &ts );
      u64 timeInNanoSeconds = ts.tv_nsec + ( ts.tv_sec * 1000000000LL );
      

      该时间将每 5 分钟左右转一圈。所以你必须经常阅读它,这样你才能检测到环绕。所以任何时候你读它,如果 ts.tv.nsec 小于你上次调用它的时候,你就有一个溢出,你必须考虑它。

      一旦您可以准确测量一秒的流逝,您就可以从那里构建您的挂钟。

      【讨论】:

      • 好的,那么linux系统时钟是如何实现的,他们真的会做所有这些检查CPU睡眠吗?可以看看linux系统时钟的源码吗?看看下面的链接...tldp.org/LDP/sag/html/hw-sw-clocks.html
      猜你喜欢
      • 2017-04-30
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2014-10-09
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多