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命令で読み出すので、最も高速。

問題

  • 時刻が複数のフィールドに分割されている場合、ラッチ機能がないと、読み出し時にカウントがずれてしまうことがある。
    • 例 00:01:59 から 00:02:00 に切り替わる瞬間に読み出してしまったケース
      タイマ      読み出した値
      00:01:59 -> 00:??:??
      00:01:59 -> 00:01:??
      00:02:00 -> 00:01:00
  • ラッチ機能がないからとタイマを止めると、タイマがずれる。(致命的)
  • ラッチ機能がない場合、何度か読み直すのがおそらく正しい対策。
    • 何度か読み直す時、周波数が高い場合にはどうしてもずれるので一致判定は無理。少なくともレジスタが±1/4周していないことを確認するのがよい。(16bit なら 16384 以上の乖離がないことを確認する。)

メモ


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-08-29 (日) 08:17:55 (8d)