« 割り込みのハンドリングはできたが・・ | トップページ | DMAに失敗する »

2010.03.07

割り込みを確実に受け取るために

DMA転送を1000万回くらいやっていると、PCの負荷が高いときに割り込みが受け取れていないことがわかりました。InternetExplorerを起動したりすると、すぐに割り込みを受け取れなくなります。

原因は単純なことでした。

今は、メインのDMA転送ルーチンでは、デバイスのDMA関係のレジスタをセットした後、イベントが来るまで待つようにしています。
DMAが完了すると、PCIeカードはINTA#割り込みを発生させます。すると、ISR(割り込みサービスルーチン)が呼ばれて、その中でDPC(遅延プロシージャコール)を呼び出して、DPCの中でイベントフラグをセットし、メインのルーチンが再開するという仕組みでした。

つまり、メインのルーチンでは
DMA転送開始→KeClearEvent→KeWaitForSingleObjectという流れでした。これらの処理は間に余計なものを挟まずに、連続して行っています。

しかし、DMA転送開始→KeClearEventの間で、(Windowsの負荷が高いときに)気まぐれでコンテキストのスイッチが行われるか何かして時間を食ってしまい、その間にDMA完了の割り込みが発生してしまうことがあるようでした。すると、イベントフラグは下がったままなので、KeWaitForSingleObjectでタイムアウトしてしまいます。

だから、
KeClearEvent→DMA転送開始→KeWaitForSingleObject
という順番にしなければいけないようです。この順番にしたら何千万回DMAをしても取りこぼすことはなくなりました。

だんだんドライバ開発の醍醐味が分かってきました。

次はスキャッタギャザーの実装にでも入るとしましょう。

|

« 割り込みのハンドリングはできたが・・ | トップページ | DMAに失敗する »

コメント

素晴らしいブランドコピーサイト

毎度お世話になります
ルイビトンのバック無事到着致しました、
とっても綺麗な色でこれからの春に向けてぴったりです、ありがとうございました
よろしくお願い致しますm(_ _)m

投稿: トリーバーチ ポーチ スーパーコピー ヴィトン | 2021.07.25 05:18

コメントを書く



(ウェブ上には掲載しません)




« 割り込みのハンドリングはできたが・・ | トップページ | DMAに失敗する »