Pi如何跟踪时间间隔?


8

据我了解,需要RTC来跟踪时间。但是,Raspberry Pi没有该功能,而是使用NTP服务器来同步其时间。

一切都很好,但是Pi如何知道一毫秒或一秒已经过去。Pi如何知道时间的流逝?


当Pi(或任何处理器)断电时,RTC确实存在(带有电池)。
章鱼

正如您所说,Pi的内部时钟只要在Internet上就由NTP设置。它是跟踪并跟踪时间的软件,而不是绝对的RTC。如果需要,标准的Linux命令可以检索该信息。因此,要回答您的问题,它所“知道的”就是最近一次设置的时间,从那以后有多少滴答声。这是一篇有趣的文章。: blog.remibergsma.com/2013/05/12/...
SDsolar

Answers:


16

RTC操作

RaspberryPi缺少的是电池支持的RTC(实时时钟)。该设备可以独立于主计算机工作,即使在关机状态下也可以跟踪经过时间(这就是为什么它有自己的电池)。它可能以非常简单的方式工作-它连接了一个已知的频率振荡器,并且在振荡器的每个脉冲上,它将增加其内部计时器/计数器。由于知道频率,因此很容易根据计数器计算经过的时间。该设备还将装有电池,因此即使关闭外部电源也可以继续工作。

一些RTC设备可能更复杂。例如,它们可以以可编程的频率或警报模式(设置为将来的某个时间或每天的某个时间等)创建中断。它与保留系统时间无关,是可选的。

如何使用RTC

计算机可以在启动时询问RTC现在几点(或更确切地说,它的计数器值是多少),并根据该值设置内部日期/时间。但是从现在开始,计算机将不再要求RTC每秒/毫秒/微秒的时间。相反,它将运行自己的时钟(称为系统时间),通常使用其自己的计时器/计数器。就像在RTC中一样,计时器/计数器以已知频率计时,因此很容易计算经过的时间。

您可以强制系统将其时钟与RTC设备同步(双向),但直到请求时才发生。例如,某些系统配置为在关闭或NTP同步后将系统时间存储在RTC中。

缺乏RTC

像许多便宜的单板计算机一样,RaspberryPi没有外部RTC设备。这意味着它不能要求启动时的当前时间。但是正如已经提到的-如果我们可以从其他来源(例如NTP)获取日期/时间,则这不是问题。唯一的缺点是,与RTC不同,您不能在早期启动时要求NTP(因为您首先需要网络连接)。

因此,直接回答您的问题-不管RaspberryPi(或任何其他计算机)是否具有RTC,它都将使用内部计时器/计数器设备来跟踪时间,该设备几乎在每个计算机系统中都可用,并且需要运行几乎任何类型的设备操作系统。

Linux中的时间

Linux中的用户空间应用程序可以calendar time使用gettimeofday()随后调用clock_gettime()系统调用的函数来确定所谓的(现实世界中的时间)。由于Linux内核具有许多高级功能(例如名称空间等),因此现在发生的事情有些复杂。但基础是内核根据维护其时间jiffies。它实际上只是内核内部的一个变量(通常为64位宽),该变量计数自系统启动以来的滴答声数量。

计时是由硬件计时器通过生成的interruptsjiffies值在每个此类中断时递增。硬件计时器配置为定期产生此类中断。该间隔是在启动时根据HZ内核配置参数的值配置的。

在任何给定的时间,内核都知道从引导生成的滴答声(jiffies变量),它知道每秒产生多少个滴答声(HZ配置选项),因此它可以轻松地计算从上次引导起经过了多少时间。

核心要求-所以总结起来RTC大约calendar time(也称为wall clock开机),所以它知道什么是实际时间系统启动时。然后jiffies/HZ,每次用户空间应用程序询问其使用clock_gettime系统调用的时间时,它都会为此增加价值。

硬件计时器/计数器设备

硬件计时器/计数器是非常简单的设备。它有一个计数器寄存器,用于对其时钟滴答进行计数。时钟滴答通常是由某些外部时钟oscillator(产生重复信号的电子电路)创建的,并且具有已知频率(通常范围从几kHz到几百MHz)。这意味着我们可以轻松地通过将计数器值除以振荡器的频率来计算经过了多少时间。

可以对计时器设备进行编程以执行各种操作-它可以向上和向下计数,将计数器寄存器与某个值进行比较。例如,当计数器寄存器处于某个值时,它可以创建一个外部信号并从头开始计数。这样,您可以配置定时器设备以恒定的间隔创建此类外部信号,该间隔的频率远低于振荡器。然后,该信号可用作CPU的中断事件。

注意振荡器可以代替定时器设备直接使用。定时器/计数器设备与振荡器的区别在于可以对其进行编程。因此,您可以将定时器/计数器设备视为更复杂的振荡器。


如果将提供有关内部计时器的更多详细信息,将会更有帮助。
AppleGrew

@AppleGrew:您对哪些细节感兴趣?
Krzysztof Adamski

您能说出您提到的计时器吗?这样我就可以阅读更多有关它们的信息。当我用谷歌“内部CPU计时器”,似乎没有任何相关。我不确定我希望从中学到什么,但是我仍然觉得自己不够清楚。
AppleGrew

@AppleGrew:我在问题中添加了更多背景信息。希望这可以帮助。
Krzysztof Adamski

顺便说一句,您可能要修复“ Linux中的时间”部分第3段中的“错误”字样。
AppleGrew

1

CPU时钟来自晶体。通常,您可以期望百万分之10到20的时钟精度(每年大约5到10分钟)


0

无论如何以一种更轻松的方式回答问题以及向您的PI添加RTC的说明,我将在下面插入一个链接。根据您是否只希望使用可靠的方法,而不是使用inet / ntp方式告知时间还是需要一种非常精确的方法,我建议您使用“ Chronodot” RTC。否则,转接板RTC可以正常工作,并且很容易上手,您只需设置I2C即可使PI与RTC进行通信。链接信息/材料

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.