[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 573] 自動補正の仕組み(Re:About timer routine type-B for AT).



  こんにちは、川合です。


橋 さんは 2000/04/19 00:15:14 の「[OSASK 572] Re: About timer ro
utine type-B for AT.」で書きました:

>川合>せん。だた、デバッグして分かったのですが、かなりタイミング的にシ
>川合>ビアです。CPUがある程度速くないと、自動補正が機能しなくなるかも
>川合>しれません(BEEPをつぶせばいいんだけど)。・・・200MHz以上のCPU
>川合>パワーがあれば問題はないと思いますが、より下のクラスのCPUではBEE
>川合>P音が出なくなるのを我慢するか、タイプAのルーチンで我慢するか、
>川合>メモリを規格以上に信頼してリフレッシュ間隔をいじるかの3択になり
>川合>ます。
>Beepは自分としては鳴らすとうるさいのでかまわないけど、最後のは
>ちょっち恐いかも。
>って(説明楽ならでいいけど)自動補正とやらの仕組みどうなってるの?

  質問に答える前に、自分の発言をフォローします。

  i486SX/25MHzなどというとてもレトロなCPUのAT機がうちにはありま
して、早速試してみました。僕の悪い予想に反し、自動補正はばっちり
効きました。もちろん、上記の3択のうちのどれもやっていません。BE
EP音は出ますし、タイプBのルーチンですし、リフレッシュ間隔もいじ
っていません。

  さて、質問に答えましょう。

  まず、タイプAとタイプBの仕組みの概略を説明させてください。タ
イプA(一般的なアルゴリズム)は、PITと呼ばれるタイマー制御のた
めのハードウェアを、たとえば「1ミリ秒間隔で割り込みを起こしなさ
い」という設定にします。そして、プログラムで何回この割り込みが発
生したのかを数えて、5ミリ秒後に割り込み処理をしなければいけない
時は、5回目の割り込みで割り込み処理ルーチンを呼び出します。実際
のタイマールーチンはマルチタスク環境に対応していて、複数の割り込
み設定を待機できるように設計しています。3ミリ秒後、7ミリ秒後、
8ミリ秒後に別々の割り込みを起こすように設定すれば、まずハードウ
ェアからの割り込みが3回起きるのを待ち(3回目で最初の割り込み処
理を呼び出す)、次に4回待ち(2番目の処理を呼び出す)、次に1回
待ちます(3番目)。これがPITの普通の使い方です。もちろん最初の
設定次第で、0.5ミリ秒単位で時間を設定できるようにもできますし、
10ミリ秒単位にもできます。一般に、この時間単位が大きいほどハード
ウェアからの割り込み処理の回数が減り、最低負荷が減少します。

  次にタイプBでのアルゴリズムです。タイプBもPITを使います。タ
イプBでは、PITの設定を頻繁に変更します。先の3ミリ秒後、7ミリ
秒後、8ミリ秒後という設定の場合、最初にPITの割り込み間隔を3ミ
リ秒にセットします。これで、3ミリ秒間はハードウェアからの割り込
みが起きません。ハードウェアからの割り込みが起きたら、すぐに最初
の処理を呼び出します。そして今度は、PITの設定を4ミリ秒に変更し
、次の割り込みを待ちます。これもハードウェアからの割り込みが来た
ら、2番目の処理を呼び出した後にPITを1ミリ秒に設定し直すわけで
す。・・・タイプAでは、この3つの割り込み処理を完了するために、
ハードウェアからの割り込みを8回受け付けました。一方、タイプBで
は3回だけです。この差が、最低負荷に大きく影響します。

  また、タイプBでは割り込み間隔の設定単位がPITの限界まで使える
というものポイントです。1ミリ秒なんていう荒い単位に縛られません
。

  しかし、タイプBとて万能ではありません。上記のアルゴリズムをそ
のまま使えば、少しずつ誤差が溜まっていきます。どういうことか説明
しましょう。

  PITの設定を変更するのにも、当然時間がかかります。どんなに速いC
PUであってもです。設定を変更している間の時間は一体誰がどこで測っ
ているのでしょうか?・・・答えは、誰も測ってくれてはいない、です
。もし、設定にかかる時間が分かれば、この設定にかかる時間を差し引
いて設定しなければいけません。この機能を僕は「自動補正」と呼んで
います。タイプAではPITの設定を変更しないので、この自動補正は全
く不要で、だから今までこんな問題は一度も起きませんでした。

  さて、誰も測ってくれない「設定変更にかかる時間」ですが、しょう
がないのでタイマーBは自分で測ります。しかし、どうやって測ったら
いいのでしょう?・・・実は、AT互換機のPITには3つのタイマーがあ
り、そのうちの1つは割り込み間隔制御で使っていますが、あと2つあ
る訳です。これを使えばいいというのが、僕の案です。この残りの2つ
のうち、1つはメインメモリのリフレッシュ制御に使われていて、もう
一つはBEEP音の音程制御に使われています。僕は、BEEP音の制御は自由
なままにしておきたかったので、リフレッシュ制御の方に目を付けまし
た。

  いろいろ調べると、430TXでDIMMを使っている場合は、リフレッシュ
制御用に「18」という設定がされているとわかりました。これは、18x
0.838マイクロ秒という意味で、かなり小さい値です。この値を読み出
せば、「0.838マイクロ秒ごとに時間を刻む時計」として利用できます
が、18カウントで針が1周してしまい、18カウント以内に読み出さない
と、誤認してしまいます(本当は23カウント経っているのに5カウント
しか経っていないと判断してしまう)。・・・これは、200MHz以上のCP
Uにはそんなに厳しくない値ですが、それ未満では誤認の危険がありま
す。誤認しても、タイマーの誤差がわずかずつ累積するだけで、それ以
上の害はありません。

  ところが、僕が使っているi486SX/25MHzマシンは違いました。もちろ
んリフレッシュ間隔の設定が18のときは誤差が溜まっていきましたが、
標準値が18ではなかったのです。なんと、151でした。チップセットが
なんなのかちょっと分からないのですが、メモリはFastPageかな?・・
・とにかく、この標準値をそのまま使う限り、誤差はちゃんと自動補正
され、良好な精度を保っていることを確認しました。

  まあ、誤差が累積しているかどうかは簡単に調べられます。ユーザー
は、誤差が累積しているような気がするなら、チェックしてみればいい
でしょう。そして、累積していて、かつ、それが気になるなら、タイプ
Aルーチンに入れ替えるとかすればいいでしょう。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.or.jp
Homepage http://www.imasy.or.jp/~kawai/