OS Project Wiki の保存版 ヒデさん・アリスさんほか、OS部のみなさんが書いたものです。
2019年にサイトが消滅しました。当時あった211ページのうち、本文が残っていたのは86ページです。すべては復旧できていません。Common Crawl と Internet Archive に 残っていたものを組み直しています(最終取得 2019-05-24)。
編集・検索・添付などの機能は動きません。表示のみです。

検索

まずは、検索!

Index

人気の20件
最新の20件
2018-12-022018-01-092017-05-072017-04-252016-05-012015-02-242014-01-032013-06-252012-12-302012-12-292012-07-272012-07-162012-02-052012-01-292011-10-012011-09-18

PIT : Programmable Interval Timer (Intel 8254)

目次

基礎知識

PITとは

Programmable Interval Timerの略で、システムのタイマー、カウンタなどに使用する。
PITには3つのタイマーがあり、メトロノームやキッチンタイマーのような働きをする。

PIT詳細

AT互換機では、1,193,182Hzのクロックで動作している。
1,193,182Hz = 1,193,182クロック/秒。
カウント値を0x2e9c(11932)に設定することで、11932回カウントする毎に割り込みが発生する。
1,193,182 / 11932 ≒ 100。1秒に100回割り込みが発生する。 = 0.01秒に1回割り込みが発生する。

割り込み回数の設定値表
割り込み回数/sカウント数
10/s119,318.20x1d216.333333333
100/s11,931.820x2e9b.d1eb851ec
1,000/s1,193.1820x4a9.2e978d4fe
10,000/s119.31820x77.51758e219
100,000/s11.931820xb.ee8bc169c
誤差0の設定値表

1秒あたりの誤差が0の割り込み回数は以下の通りです。
ですが、ハードウェアなんて適当なものだと思うので、少しくらい誤差があったほうが逆にぴったりになる気もします。(推測)

基本的には、回数が増えるにつれて、1秒あたりの誤差はどんどん増えていくので、1回の論理的誤差が0だからといって、実際の誤差が少ないとは限りません。
実際に調べてみる必要があるでしょう。

割り込み回数/sカウント数
41/s29,102.00x71ae
82/s14,551.00x38d7
14,551/s82.00x52
29,102/s41.00x29
596,591/s2.00x2

ただし、これらのカウント数だと、0.1秒や、0.01秒などの10進数の小数点数がとれないのであしからず。
1/14551秒とか、1/29102秒という単位で使えばいいかと思います。

計測結果
処理が追いつかない。orz...
QEMUで14551/sだと、ぜんぜん処理が追いつきませんでした。
割り込みの取りこぼしが明らかに多く、14551回カウントするのに2,3秒かかりました。。

I/Oポート、レジスタ

PITのI/Oポートマップ

I/OポートサイズR/W説明
0x00408bitR/Wカウンタ0(IRQ0)
0x00418bitR/Wカウンタ1
0x00428bitR/Wカウンタ2(ビープ音)
0x00438bitWコントールレジスタ

コントロールレジスタ (Port:0x0043)

カウントモード (bit:0)
  • 0:2進数カウント
  • 1:BCDカウント(2進化10進。こんなもので来ても困る。(そのまま表示の場合意外と使える。それ以外でも計算が簡単 by skyblue-tks))
動作モード (bit:1~3)
  • 000:モード0(ターミナルカウント)指定したカウント値を0まで減算し、0になったらOUT信号を"H"にする。
  • 001:モード1(プログラマブルワンショット)指定した長さのワンショットパルス(OUT信号を"L")を出力する。
  • *10:モード2(レートジェネレータ)入力クロックをn分周する。
  • *11:モード3(方形波レートジェネレータ)入力クロックを出力デューティ比50%で n分周する。
  • 100:モード4(ソフトウェアトリガストローブ)指定したカウントが終了するとストローブパルスを出力する。
  • 101:モード5(ハードウェアトリガストローブ)外部トリガ入力によりカウントを開始し、カウントが終了するとストローブパルスを出力する。
カウンタアクセスモード (bit:4,5)
  • 00:カウント値ラッチ
  • 01:下位8bitのリードロード
  • 10:上位8bitのリードロード
  • 11:16bitリードロード(下位8bit、上位8bitの順)
カウンタレジスタ指定 (bit:6,7)
  • 00:カウンタ0
  • 01:カウンタ1
  • 10:カウンタ2
  • 11:リードバックコマンド

参考ソース

#define	PORT_PIT_COUNTER0	( 0x0040 )		//カウンタ0
#define	PORT_PIT_COUNTER1	( 0x0041 )		//カウンタ1
#define	PORT_PIT_COUNTER2	( 0x0042 )		//カウンタ2
#define	PORT_PIT_CONTROL	( 0x0043 )		//コントロール

/*******************************************************************************
	PIT初期化
*******************************************************************************/
	Out1( PORT_PIT_CONTROL, 0x34 );		//カウンタ0, 16bitリードロード(下位8bit、上位8bitの順), モード2(レートジェネレータ), 2進数カウント
	Out1( PORT_PIT_COUNTER0, 0x9c );	//カウンタ値Low
	Out1( PORT_PIT_COUNTER0, 0x2e );	//カウンタ値High

参考・関連


Since 2008 July. OS Project Wiki
保存 2019-04-21 ・ ページ一覧