RX71Mマイコン USB転送速度について

RX71MマイコンのUSB制御について何点か疑問等がありますので質問いたしました

現在アルファプロジェクトさんの製品AP-RX71M-0Aを用いて、「USBメモリに10分間で、400Mバイトのデータを書き込めるか」

検証を行っており、調べてみるとRX71MからのマイコンからUSB2.0 High-Speedに対応したとの記載がありました。

アルファプロジェクトさんが提供していますサンプルソースコードを用いて上記の試験「10分間でデータ400MバイトをUSBメモリに書き込めるか」

実験を行いましたが(書き込みの処理を400Mバイト書き込めるように修正)10分間で終わらず20分ぐらいかかりようやく書き込み動作が

完了いたしました。

そこで質問になりますが、usbのhigh-speedの転送速度を確認すると480Mbps/s(60Mbyte/s)の記載がありましたが上記の結果を見る限り

そこまで速度が出てる風には見えませんでした。上記の仕様「10分間でデータ400MバイトをUSBメモリに書き込めるか」はこのマイコン製品じゃ

無理なんでしょうか。またほかのやり方等がありましたらご教示お願いいたします。

Parents
  • こんにちは

    アルファプロジェクトさんに聞いてみては如何でしょうか?

    USBは詳しくありませんが、480Mbpsは規格値の最大値であり、実際の速度はそこまでないと聞いたことがあります。

  • USB-HSの転送速度の480Mbpsってのは瞬間最大としてはでてるので間違いではないとおもいます。

    ただ、USB自体が1.1の時代から

    1msごとのポーリングをベースとしている

    という厳然たる事実があって、この1ms内に行えるデータがすべて使えるわけではないので

    注意が必要、というのがあるとおもいます。

    実際1.1やFSと混用できるようにするためマイクロパケット(512バイト)を複数詰め込めるように

    したり涙ぐましい努力があるうえ、アイソクロナス通信用の空き時間があったりと

    高速通信命!みたいなのには向かない構造ではあります。

    しかも USBメモリ自体Flashメモリであって、決して高速書き込みに適したメモリでもないので

    そこにもオーバーヘッドが存在しますし、ファイルフォーマットを合わせるためにソフトで

    行う処理もばかにならないことを考えると、健闘してるほうなんではないですか?

    規格も含めて、オーバーヘッドがどこにあるのかを検証するのが先の気がします。

  • rkshさん、こんにちは。

    すみません。私の前の投稿の以下の文は無かったことにして下さい。
    >(RX71M上で擬似的に作成したファイルだと思いますが。)
    USBメモリというと、つい(パソコン間でのファイル受け渡し用に)内蔵HDDからファイルをコピーする
    というのをイメージしてしまって、よく分からない文を書いてしまいました。よくよく考えてみれば、
    きっと、USBメモリ上に直接open()してwrite()してclose()しておられるのですよね。この時、一度
    open()するだけで400Mbyte分write()してclose()するのか、それともopen()→1Kbyte分write()→close()を
    40万回繰り返すのか、どちらのタイプか気になります。(パソコンでのUSBメモリやUSB外付けHDDの経験
    でも、小さなファイルの大量コピーは小数の巨大なファイルのコピーよりも時間が掛かるものですし。)

    ちなみに、そのUSBメモリにパソコンで400Mbyteの巨大単一ファイルを書き込んで、RX71Mでopen()
    →400Mbyte分read()→close()した場合は、どれくらいの時間なのでしょうか? (kirin様から読み込み
    時間についてのリプライがあったのですが、読み込み時間についての測定結果は書かれていません
    ですよね。)

    USBマスストレージクラスのプロトコルに関して、tetnoguchi様とflux様からのアドバイスはもっとも
    だとは思うのですが、rkshさんの文面通りの性能だとすると、私は何か違和感を感じます。240MHz
    動作の32bitマイコンで、(CPU性能では無く)インターフェース速度が大きな比重を占めそうな話題に
    関して、パソコンでの性能と100倍違うというのは、プロトコルの話とは別次元の何かがあることを
    疑ってもよいような気がするのですが、、、

    パソコンのHi Speed転送での場合    → 30Mbyte/sec
    今回のRX71MのHi Speed転送での場合 → 0.33Mbyte/sec

    もっとも、まだ、1個なのか40万個なのか、どちらのタイプなのかという話がありますが、、、

  • あぁ、ごめんなさい色々寝ぼけてました。。

    流石に実行速度2.7Mbpsは遅すぎますわ。ていうかUSB1.1のFullSpeedより遅い。流石にLowSpeedよりは早いようですが。2.0のHighSpeedじゃなくて、1.1のFullSpeedで接続実行されてませんかね。

    各スピードのハンドシェイクに関して、以下のような記載がありました↓

    www.renesas.com/.../usb2-e.html

  • fujitaさん

    状況が矛盾しているので、「秒」の書き間違えと仮定した場合の話です。

    メインの240MHz動作ではなく、実は低速LOCO 240KHz動作だったりすると矛盾は解決しそうですけど。
    CPUが設定通りの動作周波数になっているか、確認したほうがよさそうですね。

  • > 「秒」の書き間違えと仮定した場合の話です。

    Kirinさん、了解です。

    USB メモリでも、インターフェースが USB1.1 という製品も世の中には存在するようなので、

    参考: http://buffalo.jp/products/catalog/item/r/ruf-q16_4p/?p=spec

    試されたメモリについても確認された方が良いですね。PC での速度比較もされると一応の目標数値として参考になるかもしれません。

  • 回答が遅くなり申し訳ございません。

    皆様沢山のご意見ありがとうございます。

    クロックの設定につきましてはタイマ割り込みの動作確認、レジスタの設定値確認、サンプルソースコードの流用を行った結果

    240MHz動作になっていることは間違いないと思われます。

    USBメモリの書き込みについての詳細になりますが

    使用していますUSBメモリになりますが容量4GのUSB2.0となっておりました。

    書き込みの行い方になりますが、

    最初一度open()し、その後3byteのデータを120,000,000回(360Mbyte分)1ファイルに書き込み完了する時間が

    10分以内に収まるか現在評価してしています。

    上記データ書き込み完了後close()を実行いたします。

  • 回答が遅くなり申し訳ございません。

    皆様沢山のご意見ありがとうございます。

    クロックの設定につきましてはタイマ割り込みの動作確認、レジスタの設定値確認、サンプルソースコードの流用を行った結果

    240MHz動作になっていることは間違いないと思われます。

    USBメモリの書き込みについての詳細になりますが

    使用していますUSBメモリになりますが容量4GのUSB2.0となっておりました。

    書き込みの行い方になりますが、

    最初一度open()し、その後3byteのデータを120,000,000回(360Mbyte分)1ファイルに書き込み完了する時間が

    10分以内に収まるか現在評価してしています。

    上記データ書き込み完了後close()を実行いたします。

  • > 最初一度open()し、その後3byteのデータを120,000,000回(360Mbyte分)1ファイルに書き込み完了する時間が

    > 10分以内に収まるか現在評価してしています。

    あらー。それ、わざわざ遅くなるようにしてません?

    少なくともセクタサイズの512Byte単位にしないと、オーバーヘッドが馬鹿にならないきがします。

  • rkshさん、こんにちは。

    生データが3バイト毎に発生するなら、また、セクタ単位のバッファリングぐらいはライブラリで
    してくれているだろうという期待感から、更に、240MHz動作のマイコンでコール/リータンのオーバー
    ヘッドを気にする程の事案でもなさそう、ということで、私も同じコードを書くだろうと思います。
    もし、私が仕事で同じ状況になったら、次は『本当にHi Speedモードに入っているのだろうか』と
    疑うと思います。もし、会社にUSBバスアナライザがあることが分かったら何とか借りてUMと睨めっこ
    します。なければ、360Mbyteの巨大単一ファイルリード(512byteとか32Kbyteとかの塊でリード)で
    性能が出ているかどうか、書き込みも(仕様のことは脇へおいて)512byteとか32Kbyteとかの塊で
    ライトして性能が出るかどうか、また、そのUSBメモリがHi Speedに対応していないということが
    無いかどうか、あと、平行して、実はヘッダファイルの#defineを変更しないとHi Speedが使えない
    という話があったりしないか、そういったことを調べると思います。

    納期との兼ね合いもあると思いますが、『秒』では無くて『分』であるならばと気付いた後の皆様
    (私も含めて)のリプライとしては『それはさすがに遅いのでは?』という反応である感じですので、
    もう少し時間を割いて調べてみる価値はあるような気がします。

  • 問題の切り分けをしてみた方が良さそうですかねー
    「3byteを120M回」と、「512byteを700k回」とで、様子が変わるかを見てみては如何でしょうか?
    それで変わるようならバッファの問題(orライブラリの使い方の問題)、変わらないなら転送速度系のHW(の設定)の問題、と絞れるようになるのでは。
  • 回答ありがとうございます。
    調査してみると、一回に書き込む回数(3byteを120M回、512byteを700k回、6000byteを60000回)の速度を比較してみた
    結果6000byteを60000回書き込んだ方が6分で書き込みが終了し、書き込み速度は速い結果となりました。
    また、使用しているUSBを別(同時期で購入したまったく同じ型式)のに交換して時間を計測すると6000byteを60000回
    書き込んだ時間は約4分前後で終了しました。
    (同じUSBを使用しているのに転送速度に上記のような差(書き込み時間)は発生するんでしょうか。)
    またrunesas様が提供しているtfatのAPI仕様をネットで検索してもAPIの引数などの情報が出てこない(関数仕様がわからない)どこかにそういうサイトがあるのでしょうか。(現在使用しているソースコードは、アルファプロジェクト様が提供していますソースコードを利用しています)

    以上よろしくお願いいたします
Reply
  • 回答ありがとうございます。
    調査してみると、一回に書き込む回数(3byteを120M回、512byteを700k回、6000byteを60000回)の速度を比較してみた
    結果6000byteを60000回書き込んだ方が6分で書き込みが終了し、書き込み速度は速い結果となりました。
    また、使用しているUSBを別(同時期で購入したまったく同じ型式)のに交換して時間を計測すると6000byteを60000回
    書き込んだ時間は約4分前後で終了しました。
    (同じUSBを使用しているのに転送速度に上記のような差(書き込み時間)は発生するんでしょうか。)
    またrunesas様が提供しているtfatのAPI仕様をネットで検索してもAPIの引数などの情報が出てこない(関数仕様がわからない)どこかにそういうサイトがあるのでしょうか。(現在使用しているソースコードは、アルファプロジェクト様が提供していますソースコードを利用しています)

    以上よろしくお願いいたします
Children
  • こんにちは

    TFATに関して以下のサイトではわからなかったということですか?
    www.renesas.com/.../m3s-tfat-tiny.html
  • rkshさん
    シェルティです、こんにちは。

    TFATのマニュアルですが、サンプルプロジェクトの奥底に格納されていますね。

    SAさんの提示されたURLから以下のように辿れます。
    https://www.renesas.com/ja-jp/products/software-tools/software-os-middleware-driver/renesas-software-library/m3s-tfat-tiny.html
    →リンク先の下の方に「オープンソースFATファイルシステム (USBメモリ、MMC接続例)」
     →画面左側の「サンプルプログラム」
      →「RXファミリ オープンソース FAT ファイルシステムM3S-TFAT-Tiny モジュールを用いたサンプルプログラム Firmware Integration Technology 」
       →ダウンロード、解凍

    解凍データ:
    →an-r20an0293jj0101-rx-tfat-storage\workspace\sample\TFAT_sample_RX71M_with_USB\r_tfat_rx\doc\ja
     →r20uw0078jj0301_tfat.pdf

    私も少し性能測定してみました。以下サンプルはRX71MをFTPサーバにして、
    ネットワーク経由で任意のファイルをUSBメモリにアップロード/ダウンロードできます。
    https://www.renesas.com/ja-jp/software/D6000403.html

    デフォルト設定はフルスピードモードでした。
    結果は以下の通りでした。700KB/s (5.6Mbps)で、400MBの書き込みに10分位かかりました。

    USBの設定を変更してハイスピードモードにしたところ、
    結果は以下の通りでした。1800KB/s (14.4Mbps)で、400MBの書き込みに4分位かかりました。

    FTPサーバのファイルI/O周りのコードを確認したところ、ネットワークからの受信データ長(TCP/IPは1460バイト)単位で
    ファイルに書き込んでいました。大きなデータサイズを指定して一度に書き込む方が早い傾向は確実のようです。

    以上です

  • SAさん、シェルティさん、URLありがとうございます。
    PDFを確認するとAPI(R_tfat_f_open関数やR_tfat_f_write()関数等の引数や戻り値の意味)の仕様が見当たりませんでした
  • 追記:もう一度ダウンロードし、再度回答して確認してみると、見つかりました
    ありがとうございます
  • 「同じUSBデバイスなのに速度差」の件ですが、新しいデバイスで先の実験(3byteを120M)をやった後でも、同様に早いでしょうかね。
    Flashメモリなんかの製品だと、自己診断機能で一部ビットが信用できなさそう、等を判断し代替部を使う、とかの機能があったり無かったりしたような。あと、まっさらなトコロに書く時と、既に書かれてるところに上書きする時とでお作法が違うとか?
    以上、適当ぶっこいてるんで間違ってたらごめんなさい。