实时时钟如何与计算机连接?
How does a real time clock interface with a computer?
实时时钟设备如何与计算机连接?我目前正在使用内存映射 IO 和 DMA 设计我自己的计算机,但我很好奇在这种情况下如何使用实时时钟而不占用内存控制器的访问权限?
例如阅读 HPET & PIC wikipages and the Real-time clock 一个。
实际上,假设您的计算机速度足够快,您可以定期向计算机发送 interrupts。
过去,以 AC current (e.g. 50Hz or 60Hz) has been very effective. That frequency is too low to hogging access from the memory controller (since today, most RAM have access times measured in hundreds of nanoseconds and even very cheap microcontrollers have today clock rates of at least 10MHz. Your laptop's processor operates above the GHz; read also about the MegaHertz Myth) 的频率中断处理器。
您可以做现代 x86 所做的事情,并包括一条 CPU 指令,将时间放入 CPU 寄存器 (rdtsc
)。
在 x86 上,它实际上是自上次重启以来 "reference" 个周期的时间戳计数器,但它以固定的参考频率计数,而不管 power-saving 停止和更改为实际 CPU 频率.
所以您可能希望 off-chip battery-backed RTC 在计算机关闭时保持时间,或者让 OS 跟踪 OS 的比例因子和偏移量 rdtsc
就像 x86 一样,或者允许 OS 对 CPU 的内部时间进行编程,因此 read-clock 指令直接给出以纳秒为单位的绝对时间(例如,拆分为 64 位秒/ 64 位纳秒值。)
无论如何,这给非常在user-space中获取当前时间的开销很低(几十个周期,没有切换到内核模式,也没有争用I/O 等资源由多个内核共享)。因此,访问实际 battery-backed RTC 很慢并不重要。
x86 上的参考频率是 "rated" / 贴纸时钟速度,即 i7-6700k 的 4.0 GHz,无论其最大睿频或其他。这是历史因素造成的; rdtsc
用于计算核心时钟周期并直接用于提高性能,然后 OSes 开始将其用作廉价的时间源。但是后来 CPU 供应商引入了 variable-frequency CPUs 和 power-saving 打破了这一点,后来才发明了这个引用循环的东西并添加了 non-stop 特性所以 rdtsc
时钟在CPU的时钟真实时钟停止时不会停止。
您可以通过首先将其设计为 low-overhead wall-clock 来回避所有这些问题,不要指望它与核心时钟速度相关,除非这对您的设计很方便。 (例如让它计算一个时钟输入,然后让 OS and/or user-space 轻松找出运行的频率。)
实时时钟设备如何与计算机连接?我目前正在使用内存映射 IO 和 DMA 设计我自己的计算机,但我很好奇在这种情况下如何使用实时时钟而不占用内存控制器的访问权限?
例如阅读 HPET & PIC wikipages and the Real-time clock 一个。
实际上,假设您的计算机速度足够快,您可以定期向计算机发送 interrupts。
过去,以 AC current (e.g. 50Hz or 60Hz) has been very effective. That frequency is too low to hogging access from the memory controller (since today, most RAM have access times measured in hundreds of nanoseconds and even very cheap microcontrollers have today clock rates of at least 10MHz. Your laptop's processor operates above the GHz; read also about the MegaHertz Myth) 的频率中断处理器。
您可以做现代 x86 所做的事情,并包括一条 CPU 指令,将时间放入 CPU 寄存器 (rdtsc
)。
在 x86 上,它实际上是自上次重启以来 "reference" 个周期的时间戳计数器,但它以固定的参考频率计数,而不管 power-saving 停止和更改为实际 CPU 频率.
所以您可能希望 off-chip battery-backed RTC 在计算机关闭时保持时间,或者让 OS 跟踪 OS 的比例因子和偏移量 rdtsc
就像 x86 一样,或者允许 OS 对 CPU 的内部时间进行编程,因此 read-clock 指令直接给出以纳秒为单位的绝对时间(例如,拆分为 64 位秒/ 64 位纳秒值。)
无论如何,这给非常在user-space中获取当前时间的开销很低(几十个周期,没有切换到内核模式,也没有争用I/O 等资源由多个内核共享)。因此,访问实际 battery-backed RTC 很慢并不重要。
x86 上的参考频率是 "rated" / 贴纸时钟速度,即 i7-6700k 的 4.0 GHz,无论其最大睿频或其他。这是历史因素造成的; rdtsc
用于计算核心时钟周期并直接用于提高性能,然后 OSes 开始将其用作廉价的时间源。但是后来 CPU 供应商引入了 variable-frequency CPUs 和 power-saving 打破了这一点,后来才发明了这个引用循环的东西并添加了 non-stop 特性所以 rdtsc
时钟在CPU的时钟真实时钟停止时不会停止。
您可以通过首先将其设计为 low-overhead wall-clock 来回避所有这些问题,不要指望它与核心时钟速度相关,除非这对您的设计很方便。 (例如让它计算一个时钟输入,然后让 OS and/or user-space 轻松找出运行的频率。)