CPU-50 割り込みハンドリングについて
-
概要
CPU-50ではRORAにて割り込み開放するには、オールベクター割り込みを
使用する必要があります。
これは、VMEDriverユーザーズ・マニュアルにも記載されている事項でもあり、
Universeを搭載したCPU-50にてRORAの割り込み開放機能をするには
割り込みハンドリングルーチン等を変更する必要があります。
-
解説
Universeの仕様により割り込みハンドリング桙ノIACKサイクルが終了すると
内部の割り込みステータスレジスタの内容がクリアされます。
このとき、Universeは内部の割り込みステータスレジスタのビットがクリアされていて、
VMEbus上でまだ、IRQxラインがアサートされていると、次の割り込みが入ったと判断してしまいます。
このため、Universeの割り込みステータスレジスタのビットがクリアされる前に、
割り込みサービスルーチンにてRORAで割り込み開放が出来ないと
次のIACKサイクルが開始されてしまい、ベクター無しの割り込みが起きてしまいます。
-
対策
RORAにて割り込み開放する際には、ベクター無し割り込みを使用する必要があります。
-
VMEでベクター割り込みを使用するときは
割り込みハンドリングルーチン起動 (VMEドライバ) |
↓
割り込みベクタの取得 (VMEドライバ) |
↓
ベクターに対応した割り込みサービスルーチン起動 (VMEドライバ) |
↓
割り込みサービスルーチン実行 (Leafドライバ) |
の順番で実行されます。
-
VMEでベクター無しの割り込みを使用するときには
割り込みハンドリングルーチン起動 (VMEドライバ) |
↓
割り込みサービスルーチン起動 (VMEドライバ) |
↓
割り込みベクターの取得 (Leafドライバでdi_intr_acknowledge()を呼び出す) |
↓
ベクターに対応した割り込みサービスルーチンを起動 (Leafドライバ) |
↓
割り込みサービスルーチン実行 (Leafドライバ) |
の順番で実行されます。
[ドライバ設定ファイルの変更]
ベクター無しの割り込みを使用する際には、xxx.confファイルの
”interrupts"プロパティのベクターに"-1"を指定します。
また、ベクター定義用に"vector"プロパティを用意します。
※ドライバ内にddi_getlong_prop()を使用してプロパティを取得する必要があります。
コンフィギュレーションファイルの例
name="pvme332" class="vme" |
[ドライバ変更について]
vdi_intr_acknowledge()を呼び出すには、VMEドライバの機能をインクルードする必要があります。
ソースコードの最初の方に追加します。
…
#include <sys/vdi.h> <- VMEドライバのインクルードファイル char _depends_on[]="drv/VME"; |
割り込みサービスルーチン等の変更について
attachルーチンにて
…
…
|
intrルーチンにて
pvme332 = ddi_get_soft_state(pvme332_state,unit); mutex_enter(&pvme332->mutex);
if(pvme332->pvme332reg->intstat != INT_STS_ASRT){ <- 割り込みをクリアする。
vec = vdi_intr_acknowledge(pvme332->pvme332dip,arg); <- 割り込みベクタを得る。 pvme332->pv_busy &= ~PVME332_INTR_BUSY; pvme332->pvme332reg->intcntrl = INTR_DIS;
if(vec == pvme332->vector->vect1){ <- 各ベクターに対応した割り込みサービスルーチンを実行する。
cv_broadcast(&pvme332->pv_cv);
return (DDI_INTR_CLAIMED); |