据我了解,需要RTC来跟踪时间。但是,Raspberry Pi没有该功能,而是使用NTP服务器来同步其时间。
一切都很好,但是Pi如何知道一毫秒或一秒已经过去。Pi如何知道时间的流逝?
据我了解,需要RTC来跟踪时间。但是,Raspberry Pi没有该功能,而是使用NTP服务器来同步其时间。
一切都很好,但是Pi如何知道一毫秒或一秒已经过去。Pi如何知道时间的流逝?
Answers:
RaspberryPi缺少的是电池支持的RTC(实时时钟)。该设备可以独立于主计算机工作,即使在关机状态下也可以跟踪经过时间(这就是为什么它有自己的电池)。它可能以非常简单的方式工作-它连接了一个已知的频率振荡器,并且在振荡器的每个脉冲上,它将增加其内部计时器/计数器。由于知道频率,因此很容易根据计数器计算经过的时间。该设备还将装有电池,因此即使关闭外部电源也可以继续工作。
一些RTC设备可能更复杂。例如,它们可以以可编程的频率或警报模式(设置为将来的某个时间或每天的某个时间等)创建中断。它与保留系统时间无关,是可选的。
计算机可以在启动时询问RTC现在几点(或更确切地说,它的计数器值是多少),并根据该值设置内部日期/时间。但是从现在开始,计算机将不再要求RTC每秒/毫秒/微秒的时间。相反,它将运行自己的时钟(称为系统时间),通常使用其自己的计时器/计数器。就像在RTC中一样,计时器/计数器以已知频率计时,因此很容易计算经过的时间。
您可以强制系统将其时钟与RTC设备同步(双向),但直到请求时才发生。例如,某些系统配置为在关闭或NTP同步后将系统时间存储在RTC中。
像许多便宜的单板计算机一样,RaspberryPi没有外部RTC设备。这意味着它不能要求启动时的当前时间。但是正如已经提到的-如果我们可以从其他来源(例如NTP)获取日期/时间,则这不是问题。唯一的缺点是,与RTC不同,您不能在早期启动时要求NTP(因为您首先需要网络连接)。
因此,直接回答您的问题-不管RaspberryPi(或任何其他计算机)是否具有RTC,它都将使用内部计时器/计数器设备来跟踪时间,该设备几乎在每个计算机系统中都可用,并且需要运行几乎任何类型的设备操作系统。
Linux中的用户空间应用程序可以calendar time
使用gettimeofday()
随后调用clock_gettime()
系统调用的函数来确定所谓的(现实世界中的时间)。由于Linux内核具有许多高级功能(例如名称空间等),因此现在发生的事情有些复杂。但基础是内核根据维护其时间jiffies
。它实际上只是内核内部的一个变量(通常为64位宽),该变量计数自系统启动以来的滴答声数量。
计时是由硬件计时器通过生成的interrupts
。jiffies
值在每个此类中断时递增。硬件计时器配置为定期产生此类中断。该间隔是在启动时根据HZ
内核配置参数的值配置的。
在任何给定的时间,内核都知道从引导生成的滴答声(jiffies
变量),它知道每秒产生多少个滴答声(HZ
配置选项),因此它可以轻松地计算从上次引导起经过了多少时间。
核心要求-所以总结起来RTC
大约calendar time
(也称为wall clock
开机),所以它知道什么是实际时间系统启动时。然后jiffies/HZ
,每次用户空间应用程序询问其使用clock_gettime
系统调用的时间时,它都会为此增加价值。
硬件计时器/计数器是非常简单的设备。它有一个计数器寄存器,用于对其时钟滴答进行计数。时钟滴答通常是由某些外部时钟oscillator
(产生重复信号的电子电路)创建的,并且具有已知频率(通常范围从几kHz到几百MHz)。这意味着我们可以轻松地通过将计数器值除以振荡器的频率来计算经过了多少时间。
可以对计时器设备进行编程以执行各种操作-它可以向上和向下计数,将计数器寄存器与某个值进行比较。例如,当计数器寄存器处于某个值时,它可以创建一个外部信号并从头开始计数。这样,您可以配置定时器设备以恒定的间隔创建此类外部信号,该间隔的频率远低于振荡器。然后,该信号可用作CPU的中断事件。
注意振荡器可以代替定时器设备直接使用。定时器/计数器设备与振荡器的区别在于可以对其进行编程。因此,您可以将定时器/计数器设备视为更复杂的振荡器。