USBメモリファイル書き込み高速化

シナジー初心者のマサと申します。 ご教示をお願いします。


他のチップから受信したデータをUSBメモリに高速書き込みする


アプリケーションを作ろうとしています。


SK-S7G2を購入し、セットアップして、サンプルプログラムの「USBX_Mass_Strage_Host」を


指定のソフトをインストールした後、E2studioでビルドし、何とかデバッグで動作させることができました。


その後、ソフトを少々修正し、15Bytesの固定データを1レコードとして、


1000レコード分つまり、15kBytes分を配列に書き込み、


その単位でファイルに書き込み、10回ループして、計150kBytesをファイルに書き込む


プログラムを動かしました。それで時間測定してみたのですが、ファイルOpen、Closeは除いて


150kBytesの書き込みだけで数百msかかりました。 S7G2シナジー環境ではスピードはこんなものなのでしょうか?

目標は15~20MBytes/sでUSBメモリに書き込むことです。


高速化する方法がありましたらご教示ください。また、USBメモリ自体の書き込みスピードも関係すると思い


USB3.0対応のメモリで試そうとしましたが、なぜか書き込みできませんでした。


この理由も併せてお教え戴けたら幸いです。何とそよろしくお願い申し上げます。

Parents
  • わわいです
    10MByte/sec で書き込もうと思ったら、1バイト当たり100nsec でUSBのデバイスに書き込まなけりゃなりません
    お使いのCPUの周辺デバイス用のバスへの書き込み速度というのはどれだけあるでしょうか。
    手元にデータシート無いんでうろ覚えになりますが、周辺デバイスのアクセス速度というのはせいぜい数十~百nsec 程度だと思います
    これだけ見ると10MByte/sぐらいは出そーな気もしますが、1バイト送るたびにデータ転送ステータス見たりいろんなパラメータ設定したり、その上命令実行時間がかかって、転送するデータはメモリから読まないとアカン、とかなんとかしてると、データ書き込みにかかるレートはせいぜい1MByte/sec も行けばいいところじゃないでしょうか。(それでもバイト当たり1μsec)
    そーしてみると、その転送速度もそんなもん、という感じじゃないでしょうか。

    これをUSB3だか4だかにしたところで、データ自体の転送レートがそんだけしか無いんで、これ以上上げようはありません

    え?このCPU、USB3に対応してるって書いてあるぢゃん!といったところで、単にUSB3のデータフォーマットに対応してるだけって話で、その規格上の最高速度が出るってことじゃないですから。ざんねん。
  • わわいさん ありがとうございます。 
    >お使いのCPUの周辺デバイス用のバスへの書き込み速度というのはどれだけあるでしょうか。
    私もよく分かりませんが、S7G2のデータシートをみるとバスクロックが最大80MHzとあったようなので、12.5nsと
    いったところでしょうか。
    USB2.0ハイスピードが480bps バイトに直すと80MBytes/s これはMAXでせないのはわかっていましたが、
    1回に大量のデータを書き込むことで、おっしゃるとおり10Mbytes/s程度は出てもいいような気がします。
    ファイルシステムやら、USBドライバやらでオーバーヘッドがあるとしても、現状だと1MBytes/sも出ていないので、
    どこで時間がかかるのか、何か方法がないのか知りたいところです。(現状300kBytes/s程度)
    もし分かる方いらっしゃいましたら、ご教示をお願い申し上げます。
Reply
  • わわいさん ありがとうございます。 
    >お使いのCPUの周辺デバイス用のバスへの書き込み速度というのはどれだけあるでしょうか。
    私もよく分かりませんが、S7G2のデータシートをみるとバスクロックが最大80MHzとあったようなので、12.5nsと
    いったところでしょうか。
    USB2.0ハイスピードが480bps バイトに直すと80MBytes/s これはMAXでせないのはわかっていましたが、
    1回に大量のデータを書き込むことで、おっしゃるとおり10Mbytes/s程度は出てもいいような気がします。
    ファイルシステムやら、USBドライバやらでオーバーヘッドがあるとしても、現状だと1MBytes/sも出ていないので、
    どこで時間がかかるのか、何か方法がないのか知りたいところです。(現状300kBytes/s程度)
    もし分かる方いらっしゃいましたら、ご教示をお願い申し上げます。
Children
  • わわいです。
    周辺デバイスの書き込み速度がバスクロックのワンクロックで連続書き込みできるという前提では80M出る計算になりますが、果たして。
    まあ、そういう計算で行くとしても、他にかかる処理時間があと7クロック分に抑えたとしてやっと10M、
    という計算ができるなら、サンプルプログラムをそのまま使ってる場合じゃないでしょう。
    だいたい、C言語を前提としてる時点で、関数呼び出しだけでスタックの読み書き、変数のメモリアクセスなどのオーバーヘッドが出ますんで、アセンブラのコードに組み替えます。そうすれば1バイトの書き込み当たりで使用できる命令数、メモリアクセス数というのが正確に計算できるようになるので、その見積もりの上でコードを組んでいくということになろうかと思います。

    #それをやったとしても、せいぜい数Mも出ればいいところじゃないかとは思いますが

    まあ、サンプルは所詮サンプルですので、書きやすいように、見て分かりやすいように、移植やりやすいように、という前提で組まれてますんで、速度的にはどーなのか、ってところはありますからね
  • 皆さん、ありがとうございます。 マサです。
    私も15MBytes/sというのは、無理な気がしてきました。
    今より速くする方法はないかというご相談に変えさせて戴きたいと思います。
    わわいさんの仰るようにアセンブリ言語で書くというのは一つの究極の方法だと思いますが、
    私にはハードルが高いので、C言語で書くという前提で、数MBytes/s程度を目標として、
    何か方法はないでしょうか?
    現状、「USBX_Mass_Strage_Host」のサンプルをそのまま試しているだけですが、
    すみませんが、つまらない質問をさせてください。
    このシナジープラットフォームで上記サンプルを説明のとおりにそのまま行うと
    スレッド上で実行されるプログラムになりますが、これはRTOS上で動いているのでしょうか?
    RTOSで動いているとしたら、その設定で速くするようなことはできないのでしょうか?
    また、RTOSを使うとかえって遅くなるのなら、ファイルシステムやUSBホストドライバのライブラリ
    だけ利用して、OSなしでつくるというのは可能でしょうか?
    素人ですみません。。
    この他にも速くなる方法があれば、ご教示ください。
    何卒よろしくお願い致します
  • わわいです
    マルチスレッドで早くなるというのはあくまで待ち時間を他の処理に回せれるようになるってだけのはなしなんで、CPU自体の処理能力が増えるわけでないので、早くはなりませんね。
    マルチコアならともかく、そんな余計なことしてるぶん、遅くなるだけです

    単純にデータ転送(だけ)をかんがえると、DMAやDTCを導入してプログラムの介入を極力なくす、という方向しかないでしょうね。
    まあ、USBのデバイスにそれがどれだけ有効なのかはわかりませんが、ハードウエアマニュアルとにらめっこして考えましょう。

    まあ、こういう事をしようとすると、特定のCPU依存のコードとなってしまうため、サンプルや自動生成だけでは実現できないので、自分のアタマでコードを組むことになりますね

    #他社からミドルウエアを買うというテも。