IP-VLBI用デバイスドライバの修正

木村 守孝

2005年7月8日

1.修正項目

1.1 DMA転送をREWINDモードへ変更

オリジナルのデバイスドライバのDMA転送は RELATIVEモード(転送先アドレ スが自動的にインクリメントする)が使用されている。このモードは確保し たバッファ内へ順次データを転送する場合には便利であるが、バッファーが全 て満たされる前に新しい転送先アドレスを再設定できない場合、バッファーオー バーフローが発生する。この場合、高い確率でハングアップ常態に陥る。 DMA転送をRELATIVEモードからREWINDモード(転送先アドレスは毎回同じ)に変 更することでDMA転送でのバッファーオーバーフローは原理的に発生しない。

1.2 FIFOの増加分から時系列を保証する方法の採用

オリジナルのデバイスドライバではDMA転送サイズを基にデータの時刻列を保 証する仕組みになっている。このDMA転送サイズは転送前後でのFIFOの読み出 しカウンタの差と原理的に一致するはずであるが、IP-VLBIボードのハードウェ アのバグによりこの二つは一致しない。 FIFOの読み出しカウンタが示すアドレスからDMA転送が開始するはずなので、 FIFOの読み出しカウンタを用いて時系列を保証する方が信頼性が高い。

※FIFOの読み出しカウンタが異常リセットされるIP-VLBIボードが一部発見 された。時系列データを正しく取得するためにはハードウェアのバグを解消 しなくてはならない(ドライバ側では完全な解決は不可能)。

1.3 ドライバ内のバッファー構造の変更

オリジナルのデバイスドライバでは''for safety''という目的で2MBのバッファ をカーネル空間上で複数個確保している。しかし、DMAの転送サイズはハード ウェア的な制約より512KBが上限であるため、512KB以上のバッファ確保にはメ リットが無い。これはDMA転送をRELATIVEモードで使用する時、オーバーフロー を無くすためのの保険と考えられるが、REWINDモードで使用する場合には不要 である。 また、オリジナルでは1個のバッファに複数回に渡るDMA転送データを保存してお り構造が複雑になっていた。そこで、バッファ1個のサイズを2MBから512KByte と小さくし、1回のDMA転送で1個のバッファを使用することにした。バッファ の個数を64個に増加させた。

1.4 タスク切替えサイクルを1000Hzへ変更

このボードでは1回のハードトリガDMA転送で最大256KBの転送が出来る。 128Mbpsの取得モードでは128Mbps/256KB=64回/secのDMA転送がおこなわれる。 Linuxの通常のkernelでは100Hzでタスク切替えがおこなわれているため、負荷 の全く無い常態では64回/secの制御は可能かもしれないが、通常のマルチタス クOS上では安定した制御は困難である。そこで、Kernelコードの一部を変更し、 タスク切替えを1000Hzへ変更した。


更新日 2005年7月8日