0から作るソフトウェア開発
日々勉強中。。。 |
Follow @Nina_Petipa |
0から作るOS開発 割り込みその2 PICとIRQ |
8259Aのピンアサイン | |||
---|---|---|---|
シンボル | ピン番号 | 名称 | 説明 |
VCC | 28 | 電源 | +5Vを入力します |
GND | 14 | グラウンド | グラウンド |
CS | 1 |
チップセレクト (Lowアクティブ) |
CPUとデータをやり取りするICを決定する信号です この信号がLowのとき8259Aはデータを入出力できます |
WR | 2 |
ライト (Lowアクティブ) |
CSピンがLowで、WRもLowの場合CPUが8259Aに データを書き込むことができます OUT命令を使用した場合にCSとWRがLowになります |
RD | 3 |
リード (Lowアクティブ) |
CSピンがLowで、RDもLowの場合CPUは8259Aから データを読み込むことができます IN命令を使用したときにCSとRDがLowになります |
D7-D0 | 4-11 | 双方向データバス |
8ビットのデータバスです CPUは8259Aと8ビットのデータを読み書きできます |
CAS0-CAS2 | 12、13、15 | カスケードライン |
割り込みできるIRQラインを増やすために、 ここにスレーブの8259Aを接続します |
SP/EN | 16 |
SP:スレーブプログラム EN:バッファ有効 |
8259AのモードによってSPかENかの機能が変わります バッファモード時 EN:データバスの送受信を制御します(出力) バッファモード時以外 SP:Lowの時スレーブとして、Highのときマスタとして動作します |
INT | 17 | 割り込み |
CPUの割り込みピンINTRに接続します 割り込みが入るとHighにすることでCPUに割り込みを通知します |
IR0-IR7 | 18-25 | 割り込み要求 |
周辺デバイスに接続します 周辺デバイスは割り込みを要求するときに このピンをHighからLowにし、CPUからの割り込み応答が 返ってくるまでHighのままになります |
INTA | 26 | 割り込み応答 | CPUの割り込み応答ピン(INTA)に接続します |
A0 | 27 | A0アドレスライン |
CS、WR、RDと連結します CPUからのコマンド、CPUへのステータスを解釈するために使用します |
割り込み要求レジスタ(IRR) | ||
---|---|---|
ビット |
IRQ番号 (マスタ) |
IRQ番号 (スレーブ) |
0 | IRQ0 | IRQ8 |
1 | IRQ1 | IRQ9 |
2 | IRQ2 | IRQ10 |
3 | IRQ3 | IRQ11 |
4 | IRQ4 | IRQ12 |
5 | IRQ5 | IRQ13 |
6 | IRQ6 | IRQ14 |
7 | IRQ7 | IRQ15 |
割り込み中レジスタ(ISR) | ||
---|---|---|
ビット |
IRQ番号 (マスタ) |
IRQ番号 (スレーブ) |
0 | IRQ0 | IRQ8 |
1 | IRQ1 | IRQ9 |
2 | IRQ2 | IRQ10 |
3 | IRQ3 | IRQ11 |
4 | IRQ4 | IRQ12 |
5 | IRQ5 | IRQ13 |
6 | IRQ6 | IRQ14 |
7 | IRQ7 | IRQ15 |
割り込みマスクレジスタ(IMR) | ||
---|---|---|
ビット |
IRQ番号 (マスタ) |
IRQ番号 (スレーブ) |
0 | IRQ0 | IRQ8 |
1 | IRQ1 | IRQ9 |
2 | IRQ2 | IRQ10 |
3 | IRQ3 | IRQ11 |
4 | IRQ4 | IRQ12 |
5 | IRQ5 | IRQ13 |
6 | IRQ6 | IRQ14 |
7 | IRQ7 | IRQ15 |
8259Aのポートアドレス | |
---|---|
ポートアドレス | 説明 |
0x20 | マスタPICのコマンドレジスタとステータスレジスタです |
0x21 | マスタPICの割り込みマスクレジスタとデータレジスタです |
0xA0 | スレーブPICのコマンドレジスタとステータスレジスタです |
0xA1 | スレーブPICの割り込みマスクレジスタとデータレジスタです |
/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ Funtion :outPortByte Input :unsigned short address < output port address > unsigned char value < output value for port > Output :void Return :void Description :output a value to port _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */
void outPortByte( unsigned short address, unsigned char value ) { __asm__ __volatile__( "out %%dx, %%al" : : "d"(address), "a"(value) ); }
__asm__ ( "アセンブラ言語" : 出力オペランド : 入力オペランド : ワークレジスタ );
"=規則"(C言語の変数)
"規則"(C言語の変数)
拡張インラインアセンブラで使用する規則 | |
---|---|
規則 | 説明 |
"a" | EAXレジスタを使用します |
"b" | EBXレジスタを使用します |
"c" | ECXレジスタを使用します |
"d" | EDXレジスタを使用します |
"s" | ESIレジスタを使用します |
"D" | EDIレジスタを使用します |
"q" |
EAX、EBX、ECX、EDXの中から空いているレジスタを 自動的に割り当てます |
"r" |
EAX、EBX、ECX、EDX、ESI、EDIの中から空いているレジスタを 自動的に割り当てます |
"g" |
EAX、EBX、ECX、EDXの中から空いているレジスタか、 メモリを自動的に割り当てます |
"m" | メモリを割り当てます |
"0"、"1"、"2"、・・・ |
入力オペランド、出力オペランドで割り当てられたレジスタや メモリを割り当てられた順に指します |
"d"(address)
"a"(value)
out %%dx, %%al
/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ Funtion :inPortByte Input :unsigned short address < read port address > Output :void Return :unsigned char < read value from port > Description :read a value from port _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */
unsigned char inPortByte( unsigned short address ) { unsigned char data; __asm__ __volatile__( "mov %%dx, %%ax" : : "a"(address) ); __asm__ __volatile__( "in %al, %dx" ); __asm__ __volatile__( "mov %%bl, %%al" : "=b"(data) ); return( data ); }
__asm__ __volatile__( "mov %%dx, %%ax" : : "a"(address) );
__asm__ __volatile__( "in %al, %dx" );
__asm__ __volatile__( "mov %%bl, %%al" : "=b"(data) );
ICW1(Intialization Control Word1)のフォーマット | ||
---|---|---|
ビット | シンボル | 説明 |
0 | IC4 |
PICがICW4コマンドを読み込むかどうかを設定します 0:PICはICW4コマンドを読み込みません 1:PICはICW4コマンドを読み込みます |
1 | SNGL |
SINGLEビット。8259Aがカスケード接続されるかどうか設定します 0:カスケード接続されます。ICW3コマンドを書き込む必要があります 1:8259Aは1つしかありません。ICW3コマンドを書き込む必要はありません 通常カスケード接続されているので0を設定します |
2 | ADI |
コールアドレスインターバル(ADdress Interval)を設定します 0:インターバルは8になります 1:インターバルは4になります x86では設定しても無視されます |
3 | LTIM |
IRピンのIRQ信号検出方法を設定します 0:PICはIRQをエッジトリガします 1:PICはIRQをレベルトリガします 通常のマイコンでは割り込みはエッジトリガとします |
4 | 予約 | 1固定です |
5-7 | Interrupt Vector Address |
割り込みアドレスの下位3ビットです MCS-80/85システム時のみ使用します x86では無視されます |
outPortByte( 0x20, 0x11 ); /* マスタPICのコマンドレジスタにICW1を書き込み */
outPortByte( 0xA0, 0x11 ); /* スレーブPICのコマンドレジスタにICW1を書き込み */
ICW2(Intialization Control Word2)のフォーマット | ||
---|---|---|
ビット | シンボル | 説明 |
0-2 |
Interrupt Vector Address (MCS-80/85) |
割り込みベクタアドレスの上位3ビットです このビットはMCS-80/85システムで使用します x86システムでは無視されます |
3-7 |
Interrupt Vector Address (x86) |
x86の割り込みベクタアドレスです アドレスと書かれていますが実際には ベクタ番号を書き込みます |
outPortByte( 0x21, 0x20 ); /* マスタPICのデータレジスタにICW2を書き込み */
outPortByte( 0xA1, 0x28 ); /* スレーブPICのデータレジスタにICW2を書き込み */
マスタPICのICW3(Intialization Control Word3)のフォーマット | ||
---|---|---|
ビット | シンボル | 説明 |
0 | S0 |
0:IR0はスレーブPICとつながっていません 1:IR0はスレーブPICとつながっています |
1 | S1 |
0:IR1はスレーブPICとつながっていません 1:IR1はスレーブPICとつながっています |
2 | S2 |
0:IR2はスレーブPICとつながっていません 1:IR2はスレーブPICとつながっています |
3 | S3 |
0:IR3はスレーブPICとつながっていません 1:IR3はスレーブPICとつながっています |
4 | S4 |
0:IR4はスレーブPICとつながっていません 1:IR4はスレーブPICとつながっています |
5 | S5 |
0:IR5はスレーブPICとつながっていません 1:IR5はスレーブPICとつながっています |
6 | S6 |
0:IR6はスレーブPICとつながっていません 1:IR6はスレーブPICとつながっています |
7 | S7 |
0:IR7はスレーブPICとつながっていません 1:IR7はスレーブPICとつながっています |
スレーブPICのICW3(Intialization Control Word3)のフォーマット | ||
---|---|---|
ビット | シンボル | 説明 |
0-2 | ID |
接続されているマスタPICのIR0からIR7のIRQ番号を2進数で書き込みます 000b:IR0(IRQ0) 001b:IR1(IRQ1) 010b:IR1(IRQ2) 011b:IR1(IRQ3) 100b:IR1(IRQ4) 101b:IR1(IRQ5) 110b:IR1(IRQ6) 111b:IR1(IRQ7) |
3-7 | 0 | 0固定です |
outPortByte( 0x21, 0x04 ); /* マスタPICのデータレジスタにICW3を書き込み */
outPortByte( 0xA1, 0x02 ); /* スレーブPICのデータレジスタにICW3を書き込み */
ICW4(Intialization Control Word4)のフォーマット | ||
---|---|---|
ビット | シンボル | 説明 |
0 | μPM |
8259Aの動作モードを設定します 0:8086/8088(x86)モードで動作します 1:MCS-80/85モードで動作します |
1 | AEOI |
割り込み終了コマンドEOI読み取りモードを設定します 0:自動モード。CPUからのIRQ受付応答パルスを受信すると、 割り込み終了コマンドEOIを読み込んだとみなします 1:CPUは割り込み終了時に割り込み終了コマンドEOIを書き込みます |
2 | M/S |
ビット3のBUFが1に設定しているときにこのビットが使われます ビット3のBUTが0の場合は無視されます 0:バッファモードのマスタとして動作します 1:バッファモードのスレーブとして動作します |
3 | BUF |
8259Aをバッファモードに設定します 0:バッファモードで動作しません 1:バッファモードで動作します |
4 | SFNM |
IRQをネスト(多重割り込みを許可)するかどうか設定します 多数のスレーブを接続している場合にはIRQをネストする場合があります 0:IRQをネストしません 1:IRQをネストします |
5-7 | 0 | 0固定です |
outPortByte( 0x21, 0x01 ); /* マスタPICのデータレジスタにICW4を書き込み */
outPortByte( 0xA1, 0x01 ); /* スレーブPICのデータレジスタにICW4を書き込み */
OCW1(Operation Command Word1) | ||
---|---|---|
ビット |
IRQ番号 (マスタ) |
IRQ番号 (スレーブ) |
0 |
IRQ0 0:IRQ0のマスクを解除します 1:IRQ0をマスクします |
IRQ8 0:IRQ8のマスクを解除します 1:IRQ8をマスクします |
1 |
IRQ1 0:IRQ1のマスクを解除します 1:IRQ1をマスクします |
IRQ9 0:IRQ9のマスクを解除します 1:IRQ9をマスクします |
2 |
IRQ2 0:IRQ2のマスクを解除します 1:IRQ2をマスクします |
IRQ10 0:IRQ10のマスクを解除します 1:IRQ10をマスクします |
3 |
IRQ3 0:IRQ3のマスクを解除します 1:IRQ3をマスクします |
IRQ11 0:IRQ11のマスクを解除します 1:IRQ11をマスクします |
4 |
IRQ4 0:IRQ4のマスクを解除します 1:IRQ4をマスクします |
IRQ12 0:IRQ12のマスクを解除します 1:IRQ12をマスクします |
5 |
IRQ5 0:IRQ5のマスクを解除します 1:IRQ5をマスクします |
IRQ13 0:IRQ13のマスクを解除します 1:IRQ13をマスクします |
6 |
IRQ6 0:IRQ6のマスクを解除します 1:IRQ6をマスクします |
IRQ14 0:IRQ14のマスクを解除します 1:IRQ14をマスクします |
7 |
IRQ7 0:IRQ7のマスクを解除します 1:IRQ7をマスクします |
IRQ15 0:IRQ15のマスクを解除します 1:IRQ15をマスクします |
OCW2(Operation Command Word2) | ||
---|---|---|
ビット | シンボル | 説明 |
0-2 | L |
ビット6のSLビットが1の場合 現在の割り込み優先度を変更します |
3-4 | 0 | 0固定です |
5 | EOI | 割り込み終了コマンドEOIとして動作します |
6 | SL |
選択(SeLection)ビットです ビット0-2のLビットで指定した優先度に変更します |
7 | R |
ローテーション(Rotation)ビットです あるデバイスの割り込みが受付けられた後 IRQ0-7の割り込み優先度をローテーションさせ (低いものを高く、高いものを低くする) 均等に割り込みが入るようにします |
OCW2コマンド機能(ビット5-7の組み合わせ) | |||
---|---|---|---|
ビット7 R |
ビット6 SL |
ビット7 EOI |
説明 |
0 | 0 | 0 | 自動EOIモードでの優先度ローテーションを解除します |
0 | 0 | 1 | 通常のEOIコマンドとして動作します |
0 | 1 | 0 | このコマンドを受けても特に動作はしません |
0 | 1 | 1 | EOIコマンドを受け付けると同時に優先度を変更します |
1 | 0 | 0 | 自動EOIモードでローテーションを開始します |
1 | 0 | 1 | 通常のEOIコマンドでローテンションします |
1 | 1 | 0 | 現在処理中の割り込みの優先度を変更します |
0 | 0 | 0 |
通常EOIコマンドとして動作し、優先度を変更して、 ローテーションします |
outPortByte( 0x20, 0x20 ); /* マスタPICのコマンドレジスタにEOIを書き込み */
outPortByte( 0xA0, 0x20 ); /* スレーブPICのコマンドレジスタにEOIを書き込み */