![嵌入式系统中的系统时钟与硬件时钟 (RTC)](https://linux22.com/image/208439/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%9A%84%E7%B3%BB%E7%BB%9F%E6%97%B6%E9%92%9F%E4%B8%8E%E7%A1%AC%E4%BB%B6%E6%97%B6%E9%92%9F%20(RTC).png)
系统时钟由内核维护,而硬件时钟由实时时钟(RTC)维护。
- 两个时钟运行频率相同吗?
- 两者相互独立吗?
- 当实时时钟出现故障时会发生什么?对系统时钟有影响吗?
谁能告诉我这两个时钟之间的区别。
答案1
两个时钟以相同的频率运行?
通常计算机/设备/系统内有两个时钟。其中一个由电池(通常是 CR2032,可以是主电池,甚至是嵌入式系统中的超级电容器)供电,并由专用芯片运行。另一种由CPU时钟源驱动(自带石英晶体)。
通常由 32.768kHz 晶体运行。另一种来自 CPU 晶体 Mhz 或 GHz 范围。由于 CPU 型号很多,因此存在很多差异。
两者是相互独立的吗?
是的,大多数时候。但一个可以调整另一个(在嵌入式 Linux 上,您通常使用
hwclock
带有选项-r
或 的命令-w
)。 CPU时钟由启动时的芯片时钟设置(CPU不知道启动时是几点)。对于网络中的系统,CPU时钟可能通过NTP(网络时间协议)从网络中找到更好的时间值,然后调整或校正时钟芯片内部的值。当实时时钟出现故障时会发生什么会影响系统时钟?
是的,当然,如果电池耗尽,例如,计算机会以完全不合时宜的实时概念启动,但是现在,大多数系统都有一些网络连接,并在启动后很快更新其实时概念通过 NTP 协议。
谁能告诉我这两个时钟之间的区别。
如上所述,时钟源一个是芯片,另一个是CPU。
请注意,我避免将芯片时钟称为 RTC 时钟,因为 CPU 上有内部值也称为 RTC。但是,是的,这是它的通用名称。
有关的:
答案2
两个时钟以相同的频率运行?
不一定但一般不会。 硬件时钟(可以有很多,特别是在 numa 和嵌入式系统上)是以某个频率跳动的振荡器,具体取决于水晶并提供专用的隔板。这些都是时钟源。
这系统时钟不是真正的时钟源,但它将取决于给定的硬件时钟能是一些 RTC。
如果有多个 RTC,则可以根据 udev 规则选择系统将其称为 RTC 的一个。
两者是相互独立的吗?
一般不会,但是……可能。
内核提供了不同的硬件时钟源,最常见的是:
时间戳计数器 (TSC)、高精度事件定时器 (HPET)、ACPI 电源管理定时器 (ACPI_PM)、可编程间隔定时器 (PIT) 和实时定时器时钟(RTC)。
您可以列出您的系统时钟上可用的时钟源/sys/devices/system/clocksource/clocksource0/available_clocksource
,您可以选择首选的系统时钟源回显/sys/devices/system/clocksource/clocksource0/current_clocksource
那么你能实际上强制你的系统时钟依赖于 RTC。
这是一般来说不建议这样做,因为 RTC 的读取成本很高,并且与基于 CPU 频率的时钟源相比,通常会获得较低的分辨率。
因此,它对于与实时内核一起使用并不是最佳选择。
linux 内核首选时钟源是 TSC。 (系统在启动引导过程时将依赖它)我的引导日志告诉:
时钟源:切换到时钟源 tsc-early
然而,在无滴答系统上,这个源肯定不稳定并且不能可靠地使用。在这种情况下,如果可用,内核将切换到 HPET,这是第二个首选。
tsc:由于 TSC 在空闲状态下停止而将 TSC 标记为不稳定
时钟源:切换到时钟源 hpet
实时时钟出现故障时会发生什么会影响系统时钟
在运行时,只要 RTC 不是首选时钟源,就不会发生任何错误(从内核的角度来看)。
当然,由于看门狗通常基于 RTC,因此它们的有效性变得……不可预测,这在嵌入式系统上确实是一个问题。
重新启动时,您的系统可能会以一些不可预测的日期和时间启动能可能是杂项日志管理和 cron 决策的一个问题。
答案3
RTC 通常用于在重新启动后维持时间,这就是它拥有自己的电池的原因。这使得系统在早期启动期间、在 NTP 可以与“互联网”同步时间之前对时间有一个准确的了解。如果 RTC 发生故障,早期的启动时间戳将是无意义的,通常是 UTC 1970 年 1 月 1 日,Unix 纪元的开始;初始值为0。
需要注意的一件事:类 Unix 系统将 UTC 存储在 RTC 中。 Windows(是的,有嵌入式版本的Windows)将本地时间存储在RTC中。来回切换可能会导致混乱,并且双引导会变得一团糟,除非类 UNIX 有特殊处理(Linux 执行 IIRC;引导期间的一些内核参数)。