第1章 PCのアドレス・マップと

割り込みコントローラ(12)

ICW1・ICW2・ICW3・ICW4

 

ICW1

 ICW1のビット7〜5,2は8080/8085モードのときだけ有効なので,PCの場合は意味をもちません.簡単のため“0”にしておくのがよいでしょう.

 ICW1のビット1はPICが単独で使われている場合は“1”に,複数のPICをカスケード接続している場合は“0”にしますが,PCの場合は2個のPICをカスケードにしているので,常に“1”となります.

 ICW1のビット0を“0”にすると,ICW4はデフォルト値となり,8080/8085モードになってしまうので,PCでは“1”にして,ICWで8086モードに設定しなくてはなりません.

 ICW1ビット3はPICの割り込み入力をレベル・トリガで使うか,エッジ・トリガ・モードで使うかを指定しますが,各入力ごとではなくチップ全体の一括設定しかできません.

 レベル・トリガの場合は割り込み入力が“H”レベルであるかぎり何度でも割り込み要求が発生しますが,エッジ・トリガの場合は“L”から“H”への変化があったときに割り込みとなります.PCの場合にはエッジ・トリガ・モードで使用します.

 少し注意が必要なのは,エッジ・トリガ入力の場合でも,割り込み要求が受け付けられる(ISRにセットされる)までの間は“H”レベルを維持しなくてはならないということです.CPUがINTAを返したときにIR入力を“L”レベルにしてしまうと,「不完全割り込み」の扱いになります.

 不完全割り込みの場合,PICはIR7に相当するベクタ番号を出力します.このときISRには新たなビットはセットされないので,ソフトウェアではIR7の割り込みを受けた場合,念のためにISRを見て「不完全割り込み」ではないことを確認しておいたほうがよいでしょう.

ICW2

 ICW2は割り込みベクタのベース・アドレスを指定します.80x86のハードウェア割り込みベクタは8ビットありますが,このうち上位5ビットを設定します.下位3ビットは,割り込み要因番号がそのまま使われます.

 たとえば,ICW2に20hを設定しているときにIR3の割り込みが発生したとき,割り込みベクタは23hが出力されます.

ICW3

 マスタとスレーブのPICでは設定値の意味が異なります.マスタPICの場合,ビット7〜0がそれぞれIR7〜IR0に対応しており,該当する入力にスレーブPICがつながっているときは“1”を,スレーブPICが接続されていないときは“0”を設定します.PCではマスタPICのIR2にスレーブPICがつながっているので,設定値は04hとなります.

 スレーブPICの場合は,自身がマスタの何番のIRに接続されているかを設定します.PCのスレーブPICはマスタのIR2につながっていますから,02hを設定します.

ICW4

 ビット3〜2は大規模システムでPICの出力にバッファを付ける必要がある場合に設定しますが,PCではノン・バッファ・モードで使っているのでビット3は“0”にします.

 PC/ATの場合,後述しますがバッファ・モードにプログラムするとPICを壊す恐れがあります.現在のチップ・セットに吸収されたPICの場合,この機能自体が削除されているでしょうから,間違ってもだいじょうぶと思われますが,念のためプログラムを確認しておいたほうがよいでしょう.

 ICW4のビット0は,8080/8085モードでは“0”,8086モードでは“1”とします.PCではもちろん“1”です.

 ビット1はEOI(エンド・オブ・インタラプト)モードの設定です.EOIというのはCPUが割り込みを受け付けた後,PICに対して割り込み処理が完了したことを示すものです.図3のようにPICはEOIを受けると,ISRの対象ビットを“0”にします.ISRが“1”になっていると,その割り込みを新たに受け付けることはできないのですが,“0”になると再び受け付け可能な状態となります

(図3)割り込み応答動作の概略

 オートEOIは,CPUがINTAで割り込みに応答した時点でEOIが行われたものとして,ISRをクリアします.ノーマルEOIというのはCPUがPICにEOIコマンドを書き込むことでEOIとするものです(OCW2を使用).PC用のOSではノーマルEOIで動作させるのがふつうです.

 ビット4はマスタPICを特殊完全ネスト・モードで動作させるか否かを設定します.スレーブPICや特殊完全ネスト・モードにしないマスタPICには“0”を設定します.

 特殊完全ネスト・モードというのは,スレーブPICからの多重割り込みを許すモードです.通常,PICをカスケード接続した場合,スレーブPICからの割り込み要求はマスタPICのひとつの割り込みに入力されます.このとき,通常はマスタのISRはセットされ,同一スレーブからの割り込みは受け付けられません.これはハード的には当然と思える動作なのですが,割り込みの優先度という考えからすると変なのです.

 たとえば,PCでIRQ10,IRQ9の順序で発生したとしましょう.IRQ10がスレーブPICに受け付けられると,マスタPICのIR2を通してCPUに割り込みが入ります.ここでINTAが返ってくると,マスタPICのISR2とスレーブのISR2が立ちます.このときIRQ9(スレーブのIR1)が発生すると,IR1のほうがIR2よりも優先度が高いので,再びマスタPICに割り込みをかけにいくのですが,マスタで割り込みが抑えられているため,次の割り込み要求が発生しません.

 つまり,割り込み優先度が高いにもかかわらず受付られない状態になってしまうのです.この対策として用意されたのが特殊完全ネスト・モードです.マスタPICをこのモードに設定すると,スレーブPICからの割り込みがサービス中であっても,次の割り込みを受け付けるようになります.

 ただ,このモードに設定したときはひとつのスレーブから多重に割り込みが発生することになるため,CPUがEOIを発行するときにペンディング中の割り込みがスレーブにあるか否かをチェックする必要があります.

 すなわち,マスタPICにEOIを出すときはスレーブのISRが00h,つまりすべてのスレーブからの割り込みをサービスが終えていることを確認してから行います.スレーブのISRが00hでないときにマスタにEOIを発行してはなりません

 PC用のOSでは,ノーマル完全ネスト・モードで使っている(特殊完全ネスト・モードではない)ほうが多いと思われます.


Copyright 2000 桑野 雅彦

新刊のご案内


Copyright 1997-2001 CQ Publishing Co.,Ltd.