RTC Real Time Clock 实时时钟
- 轮询:时钟中断的时候不停的去检测
- 实时中断
正处于更新过程中 (Update In Progress, UIP). 该位可以作为一个状态进行监视,CMOS RAM 中的时间和日期信息会由 RTC 周期性地更新,在此期间,用户程序不应当访问它们。对当前寄存器的写入不会改变此位的状态
- 0: 更新周期至少在 488 微秒内不会启动,换句话说,此时访问 CMOS RAM 中的时间、日历和闹钟信息是安全的
- 1: 正处于更新周期,或者马上就要启动
如果寄存器 B 的 SET 位不是 1 , 而且在分频电路已正确配置的情况下,更新周期每秒发生一次,在此期间,会增加保存的日期和时间、检查数据是否因超出范围而溢出(比如,31 号之后是下月 1 号,而不是 32 号),还要检查是否到了闹钟时间,最后,更新之后的数据还要写回原来的位置;
更新周期至少会在 UIP 置为 1 后的 488μs 内开始,而且整个周期的完成时间不会多于 1984 μs, 在此期间,和日期时间有关的存储单元 (0x00 ~ 0x09) 会暂时脱离外部总线。
为避免更新和数据遭到破坏,可以有两次安全地从外部访问这些单元的机会:当检测到更新结束中断发生时, 可以有差不多999ms 的时间用于读写有效的日期和时间数据:如果检测到寄存器 A 的 UIP 位为低 (0) ,那么这意味若在更新周期开始前,至少还有 488μs 的时间。
分频电路选择 (Division Chain Select),这 3 位控制晶体振荡器的分频电路。系统将其初始化到 010, 为 RTC 选择一个 32.768kHz 的时钟频率。
速率选择 (Rate Select, RS),选择分频电路的分节点。如果寄存器 B 的 PIE 位被设置的话,此处的选择将产生一个周期性的中断信号,否则将设置寄存器 C 的 PF 标志位;默认是 0110,976.S62S μs
3 ~ 0 位 | 时间片 |
---|---|
0000 | 从不触发中断 |
0001 | 3.90625 ms |
0010 | 7.8125 ms |
0011 | 122.070 μs |
0100 | 244.141 μs |
0101 | 488.281 μs |
0110 | 976.5625 μs |
0111 | 1.953125 ms |
1000 | 3.90625 ms |
1001 | 7.8125 ms |
1010 | 5.625 ms |
1011 | 1.25 ms |
1100 | 62.5 ms |
1101 | 125 ms |
1110 | 250 ms |
1111 | 500 ms |
- 7:更新周期禁止(Update Cycle Inhibit, SET)。允许或者禁止更新周期
- 0: 更新周期每秒都会正常发生
- 1: 中止当前的更新周期,井且此后不再产生更新周期,此位置 1 时,BIOS 可以安全地初始化日历和时间
- 6:周期性中断允许(Periodic Interrupt Enable, PIE)
- 0: 不允许
- 1: 当达到寄存器 A 中 RS 所设定的时间基准时,允许产生中断
- 5:闹钟中断允许(Alarm Interrupt Enable, AIE)
- 0: 不允许
- 1: 允许更新周期在到达闹钟点并将 AF 置位的同时,发出一个中断
- 4:更新结束中断允许(Update-Ended Interrupt Enable, UIE)
- 0: 不允许
- 1: 允许在每个更新周期结束时产生中断
- 3:方波允许(Square Wave Enable, SQWE) 该位保留不用,只是为了和早期的 Motorola 146818B 实时时钟芯片保持一致
- 2:数据模式(Data Mode, DM) 该位用于指定二进制或者 BCD 的数据表示形式
- 0: BCD
- 1: Binary
- 1:小时格式(Hour Format, HOURFORM)
- 0: 12 小时制,在这种模式下,第 7 位为 0 表示上午(AM),为 1 表示下午(PM)
- 1: 24 小时制
- 0:老软件的夏令时支持(Daylight Savings Legacy Software S叩port, DSLSWS),该功能已不再支持,该位仅用于维持对老软件的支持,并且是无用的
-
7:中断请求标志(Interrupt Request Flag, IRQF)
$IRQF = (PF \times PIE) + (AF \times AIE) + (UF \times UFE)$ 以上,加号表示逻辑或,乘号表示逻辑与。该位被设置时,表示肯定要发生中断,对寄存器 C 的读操作将导致此位清零
-
6:周期性中断标志( Periodic Intenupt Flag, PF)
- 若寄存器 A 的 RS 位为 0000, 则此位是 0
- 否则是 1,对寄存器 C 的读操作将导致此位清零
- 注:程序可以根据此位来判断 RTC 的中断原因
-
5:闹钟标志( Alum Flag, AF)
- 当所有闹点同当前时间相符时,此位是 1
- 对寄存器 C 的读操作将导致此位清零
- 注:程序可以根据此位来判断 RTC 的中断原因
-
4 更新结束标志 (Update-Ended Flag, UF)
- 紧接着每秒一次的更新周期之后,RTC 电路立即将此位置 1
- 对寄存器 C 的读操作将导致此位清零
- 注:程序可以根据此位来判断 RTC 的中断原因
-
3 ~ 0:保留,总是报告 0
- 7:有效 RAM 和时间位(Valid RAM and Time Bit, VRT)
- 在写周期,此位应当始终写 0
- 在读周期,此位回到 1
- 在RTC 加电正常时,此位被硬件强制为 1
- 6:保留,总是返回 0.并且在写周期总是置 0
- 5 ~ 0:日期闹钟(Date Alarm) ,这些位保存着闹钟的月份数值
- 李忠 & 王晓波 & 余洁 - 《X86汇编语言》,电子工业出版社
- Motorola MC146818A Datasheet
- https://wiki.osdev.org/RTC
- http://bos.asmhackers.net/docs/timer/docs/cmos.pdf
- https://web.archive.org/web/20150514082645/http://www.nondot.org/sabre/os/files/MiscHW/RealtimeClockFAQ.txt
- https://www.qemu.org/docs/master/system/qemu-manpage.html?highlight=rtc%20localtime