如何在c中实现类似于linux系统时钟的时钟

时间:2014-09-30 13:45:33

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

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

提前致谢,

Anandhakrishnan Ramasamy。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

很难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小于你上次调用它时,你就会有溢出,你必须考虑它。

一旦你能准确地测量一秒的通过,你就可以从那里建立你的挂钟。