pshikoro's blog

休日プログラミング

PIC[Programmable Interrupt Controller]とICW[Initical Control Word]とは

PICとICW

どちらもCPUの割り込み制御に関する話題のキーワードである。

CPUには割り込み処理を受け付けるための入力ピンがある。

この割り込み処理を受け付ける入力ピンに信号を送る処理を受け持つのがPIC=>Programmable Interrupt Controllerである。

PIC自体は複数ピンの入力と1本の出力を持ち、その出力がCPUの割り込み入力ピンにつながっている。

PICの各入力ピンに信号が入ってきたときに、どのようにCPUへ信号を出力するかをICWに設定することで、割り込み信号に対する制御をプログラムすることができる。
これがProgrammableと名付けられる所以である。

ICWは4種類あり、ICW2以外は各ICWの1bitごとがPICの各入力ピンに対応しているような設定値である。

PICのマスタとスレーブについて

PICが一個であると、PIC一個についてるピンの数だけしか割り込み信号を受けられない事となる。

より多くの割り込み信号を受け取るために、PICを多段に組み、一つのPICの入力ピンにもう一つのPICの入力ピンをつなぐことで、より多くの信号を受け取れるようにしてあることがある。

このときの、直接CPUにつながっているPICをマスタ、子の方をスレーブと呼ぶ。

なおスレーブの方は割り込み信号が来たということを伝えることはできるが、子のどのピンに割り込みが来たかを伝えることはできない。

ICWについて

ICWは4種類あるが、ICW1と4はPICが基板上でどのように配線されているかというハードウェア的な設定値であるので、各基盤ごとの固定値以外を設定することはほぼない。

ICW3については、PICのマスタとスレーブが、マスタのどのピンでつながっているがを設定する。 これもハードウェア的な設定値であるので、基盤ごとの固定値以外を設定することがない。

なので、プログラマ的に設定することがあるICWは2番だけになる。

ICW2は、各割り込み信号が何番の割り込み信号として認識されるかを設定する値である。 0x20を設定した場合はピン1-8の割り込みがが0x20-0x27の割り込みとして認識されるようになる。

割り込み信号が来た際にCPUの実行するべき命令が何番の割り込み命令か◯◯(◯◯はICW2で設定した数値)に見えるようにハードウェア的に設定されている。 各番号の割り込み時にどの関数を実行するかをIDT(Interrupt descriptor table)に設定することで、割り込み時の処理を設定することができる。

なおICW2で設定する割り込み信号に対する割り込み番号の設定だが、0x00~0x1fはアプリケーションで発生した例外に対してCPUが自動的に割り込みを発生させてOSに知らせる際の番号として利用されているため、設定することができない。

ICW2には0x00~0x1f以外の値を設定することが望ましい。