IP-VLBI用デバイスドライバの修正
木村 守孝
2005年7月8日
1.修正項目
- DMA転送をREWINDモードへ変更 (ハングアップの対応)
- FIFOの増加分から時系列を保証する方法の採用 (データずれの対策)
- ドライバ内のバッファー構造の変更
- タスク切替えサイクルを1000Hzへ変更
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日