PC
PC/AT が一般に持つハードウェアクロック †
CMOS RTC †
- ほぼ間違いなくある。(組み込みシステムとかではないかもしれない。)
- 一般に Motorola MC146818 と互換。
- 時刻の読み出しは「年/月/日 時:分:秒」の各フィールドとなる。精度は1秒。
- PC/AT ハードウェアの中で唯一のカレンダ時刻の持ち主。
- 2~8192Hz で、2の乗数(2,4,8,...8192)の周波数で割り込みをかけることができる。
- ハードウェア的には、RTCに使われる水晶の振動数は毎秒32768サイクル(32.768KHz)で、量産されている一般のクォーツ時計と同じもの(ただしかなり精度が悪い)
- カウンタの読み出し不可。
- 電源が切れていても CMOS バックアップ電池がある限り動き続ける。
PIT (Programmable Interval Timer) †
- ほぼ間違いなくある。
- 一般に i8254 と互換。(i8253がオリジナルでi8254が改良版)
- 基準周波数は約1193182Hz (3579545/3Hz)
- カウンタは 16 bit
- カウンタ初期値あり。
- 3つのタイマがあるが、OSなどに解放されているのはタイマ0のみ。タイマ2も使えないことはない。
- タイマ0 割り込み
- タイマ1 DRAM リフレッシュ
- タイマ2 システムスピーカー発振(PC起動時のポーって音を出すアレ)
HPET (High Precision Event Timer) †
- チップセットが持つ。ICH4 (845E/845G/845GL)以降。AMD のチップセットにも最近は付いてるらしい。
- 基準周波数は 10MHz 以上。実際には標準の CPU クロックと同等の周波数がかかることが多いようだ。(ただし、CPU クロックの変動は影響しない。)
- カウンタは 64 bit(または 32 bit)
- RTC と i8254 を置き換えるためのもの。
- 32 bit CPU で読み出す場合、ラッチがないので、クロックを止めて 32 bit づつ読み出すか、何度か読み直すか、32 bit カウンタにするしかない。
- 昔はマルチメディアタイマ (Multimedia Timer) と呼ばれていた。
- Intel の仕様書 http://www.intel.com/technology/architecture/hpetspec.htm
- 今の PC/AT アーキテクチャで選択するならこれがたぶん一番よい。
- I/O 読み出しになるため、500ns 程度の時間がかかってしまう。元の精度自体は高いにもかかわらず、オーバーヘッドのために正確さがなくなってしまっている。
ACPI PM タイマ (Advanced Configuration and Power Interface Power Management Timer) †
- マザーボードに ACPI があればある。
- 基準周波数は3579545Hz (NTSC色副搬送波周波数と同じ。クロックが安価なので使われる。)
- カウンタは 24 bit
- カウンタ初期値なし、単純に一周。
Local APIC Timer (Advanced Programmable Interrupt Controller) †
- Pentium 以降は内蔵
- 基準周波数はCPUクロックと同じ。
- 1,2,4,8,16,32,64,128 分周で使われる。
- カウンタは 32 bit
TSC (Time Stamp Counter) †
- Pentium 以降
- 基準周波数はCPUクロックと同じ。
- カウンタは 64 bit
- CPU のパワーマネジメント機能によりクロック周波数が低下する場合がある。(CPU throttling)
- HLT 命令などでカウンタが止まる場合がある。
- デュアルコアやマルチCPUでは、カウンタは同期しない。(OS が強制的に同期させているケースはある。)
- 一部のCPUでは命令を分解するのでカウントがクロックと同期しない(?)
- CPU内部のカウンタを1命令で読み出すので、最も高速。
問題 †
- 時刻が複数のフィールドに分割されている場合、ラッチ機能がないと、読み出し時にカウントがずれてしまうことがある。
- ラッチ機能がないからとタイマを止めると、タイマがずれる。(致命的)
- ラッチ機能がない場合、何度か読み直すのがおそらく正しい対策。
- 何度か読み直す時、周波数が高い場合にはどうしてもずれるので一致判定は無理。少なくともレジスタが±1/4周していないことを確認するのがよい。(16bit なら 16384 以上の乖離がないことを確認する。)
メモ †
|