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対応のメモリで試そうとしましたが、なぜか書き込みできませんでした。


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

  • わわいです
    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に間違いがありました。
    >USB2.0ハイスピードが480bps バイトに直すと80MBytes/s 
    60MBytes/Sでした。すみません。
  • 「15~20MBytes/sでUSBメモリに書き込む」は無理な気がします、なぜかというとUSBメモリに書き込みは、読み出しと違って書き込み動作、つまりイレーズとプログラムの時間がかかるからです、これは読み出し時間の数倍~数十倍かかります、最近のメモリは改善されているそうですが基本的には構造変わりませんので。
  • わわいです。
    周辺デバイスの書き込み速度がバスクロックのワンクロックで連続書き込みできるという前提では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依存のコードとなってしまうため、サンプルや自動生成だけでは実現できないので、自分のアタマでコードを組むことになりますね

    #他社からミドルウエアを買うというテも。
  • マサさん、こんにちは。NoMaYと申します。

    本家RulzのSynergyを検索してみたところ、ひとまず以下の投稿が見付かりました。(Peter Carbone氏は現在の肩書きはルネサスのSynergyプラットフォーム事業部の事業部長だと思われます。) 問題は、この速さがリードなのかライトなのかという点(追記:この投稿の一番下に書いたURLのブログ記事の数値から予想すると多分リードなのでしょうね、ライトの数値もあると良かったのですが)と、マサさんもお困りのようにコードをどう書けば(あるいはe2 studio ISDE上で行うConfigurationかも知れませんが?)よいのかという点、ですよね。私はSynergyには詳しくない(未経験者)ですが、この先の進め方として、週明けにリプライがあるか暫く様子を見て、無ければRenesas社の会社としての問い合わせ窓口に相談してみてはどうかと思います。その時に、この本家RulzのURLを一緒に書いておけば、Renesas社の相談窓口の人にも取っ掛かりになるかと思います。

    USBX Throughput Expectations
    renesasrulz.com/synergy/f/synergy---forum/6508/usbx-throughput-expectations/20815#20815

    Peter Carbone    13 Jun 2016 6:38 (← 時刻はGMTだろうか)

    In reply to RichZ:

    You should see greater than 9MB/Sec rates with the next release in about two weeks.


    なお、かふぇルネで私が関わったものとしては、Synergyではありませんが、RX71Mの以下のスレッドがあります。この時には、ひとまず投稿内で360MBを6分(=1MByte/s)とか4分(=1.5MByte/s)とかで書けた(USBメモリに依存(同時期で購入した同じ型式でも個体差がある))とのリプライがありました。

    RX71Mマイコン USB転送速度について
    japan.renesasrulz.com/cafe_rene/f/forum5/3802/rx71m-usb/19145#19145

    ちなみに、USBメモリの速度に関して以下でググってみましたが、幾つか見てみた中では以下のページのデータが分かり易かったです。

    Google検索:
    www.google.co.jp/search?q=USBメモリ+書き込み速度

    USB2.0とUSB3.0のUSBメモリアクセス速度比較 - CMAN IT性能比較実験
    hikaku.cman.jp/usb_standard/
     

  • マサさん、こんにちは。NoMaYです。

    夕食を取って、何気なく、昼にリプライした投稿のGoogle検索の結果で読まずに飛ばしていたものを読み始めて、失態を犯していたことに気付きました。検索結果の先頭にあったブログで、以下の数値が出ていました。昼の投稿の最後に書いたURLのブログの数値(Seq Read≒18MB/s, Seq Write≒4MB/s)よりも格段に速いUSBメモリもあるですね。更に、以下のポータブルハードディスクでの数値から推測されることは、USB 2.0のマスストレージクラスのプロトコル上のオーバーヘッドというのは決してむちゃくちゃにデカいオーバーヘッドがある訳では無い、というところですね。本家Rulzに出ていたgreater than 9MB/Secという数値も、速いUSBメモリを使えば、ReadだけでなくWriteでも出せるかも知れない、そんな可能性も無くは無いのかも知れない、という気もして来ました。ルネサス社に要確認ですね。

    USBメモリの転送速度が遅い理由 - PCと解
    特に書き込みについて
    pctrouble.net/storage/reason_slow_usbmemory.html

  • マサさん、こんにちは。NoMaYです。

    たびたび済みません。ルネサス社に問い合わせてはどうかと書いておきながら、こういうことを書くのはちょっとチグハグかなと我ながら思うのですが、以下の点は大丈夫でしょうか?

    ・ヘッダファイル(もしくはGUIによる設定ツールとか)で以下の有効/無効を切り替える仕組みになっていないか?

     High speed modeを使用する → それが、いいえ、になっているとか?
     DMAを使用する → それが、いいえ、になっているとか?

    前にも書いたように、私はSynergyには詳しくない(未経験者)ですが、一般的なこととして気になり始めました。