02-05-2017 02:41 AM
cRIO-9074を使用してあるデータロギング/監視システムを構築中です。
FPGA上で読み取ったデータをFIFOへ書き込んで、RT上でFIFOを読み取ってホストPCへ転送する。というものです。
(データロギングは一度だけではなく、ある一定の間隔を設けて断続的に行います。)
ここでRT⇒ホストPCへのデータ転送はネットワークストリーム関数を使用しています。
RT上の確定的ループ内でFIFOからデータを読み取って、キューに格納し、非確定的ループ内でキューの値を読み出したらネットワークストリームに書き込む。という流れです。(添付1:RT データ転送部のブロックダイアグラム)
一通り実装が完了し、正常に動作する事が確認できたので色々な条件で動作テストをしていた所、長時間動作させた際にある時点以降ストリームの書き込みができなくなる事が判明しました。
色々と検証を行った結果、RTターゲットのメモリ不足による可能性が高いことが分かりました。
VI実行中に分散システムマネージャーにてRTの利用可能メモリをモニタした所、ある水準に達した所でネットワークストリームの書き込みが止まっていました。(書き込み関数は実行しているが空のデータを書き込んでいる模様)
割り当て済みメモリが128MBに達した為?
(添付2:正常動作中の分散システムマネージャー画面)
(添付3:ストリーム書き込み不能に陥った後の分散システムマネージャー画面)
ちなみにこの時は10800ポイントの倍精度実数配列を転送しています。
このデータを682回転送したのちに書き込みができなくなりました。
転送データを少なくすると転送可能回数は増加し、データを多くすると減少します。
一度に転送するデータ量によって監視可能な連続運転時間が制限されてしまうのではシステムとして成り立たない為、
なんとかこの問題を回避できないものかと苦悩しております。
一度に転送できるデータ量に制約があるのはターゲットリソースに依存するので理解できますが、累積データ転送量に制約が出てくるのは何となく腑に落ちません。
何卒、回避策のご教授お願い致します。
02-22-2017 07:10 PM
自己解決しましたので備忘録の意味もこめて以下に記します。
FPGAのDMA転送では1チャンネルあたり最大5000点で3チャンネル分を想定しています。
したがって一度の転送で必要となる最大要素数は5000×3=15000点となります。
書き込みエンドポイントを作成する時の要素数に何も考えずにこの15000という数字を配線していましたが、
ここで言う要素数は配列の中身ではなく、配列そのものの要素数でした。
毎回、15000個分の配列領域を確保していた為、メモリ不足に陥ったものと思われます。
この数字を配列そのものの数である「3」に変更したところ、メモリ不足に陥ることなく、作動しました。
以上。