Mass Storageでのアクセス速度が遅かったので、改善を試みてみました。
SDへの書き込みが遅い原因としては、前回も予想したように書き込み時のACMD23を使っていないことが考えられます。一方、SDからの読み込みも満足できる数字ではないので、これも改善したいところです。こちらの方は、USBのコードを確認したところ、すぐに原因に思いあたりました。なんと、FIFOのPING-PONG機能を使っていませんでした。PING-PONG機能とはダブルバッファリング機能のことで、USBエンジンのFIFOに書き出した送信データをUSBホスト側に送信している間に、次の送信データをあらかじめもうひとつのFIFOに貯め込んでおける機能のことです。
上記2点を改善したところ12MBのファイルで
READ: 約15秒 (800KB/sec)
WRITE: 約35秒 (342KB/sec)
というところまでは改善できました。およそ倍ですね。SDとのI/Oは8ブロック(4KB)単位でおこなっていますが、Windows XPからは128ブロック(64KB)単位でのI/O要求がきているようです。したがってマイコン内の処理単位も大きくしてやればさらなる改善も可能かと思われますが、32KBしかないRAMをこれ以上割くのはもったいないので、こんなところで我慢することにしようかと思います。READの方は800KB * 8 = 6.4Mbpsですから、USBフルスピード12Mbpsの半分は出ていることになります。
気がつくと、なんだかんだで1か月くらい複合デバイスやっていたので、いい加減何か違うことやりたくなってきました。
SDへの書き込みが遅い原因としては、前回も予想したように書き込み時のACMD23を使っていないことが考えられます。一方、SDからの読み込みも満足できる数字ではないので、これも改善したいところです。こちらの方は、USBのコードを確認したところ、すぐに原因に思いあたりました。なんと、FIFOのPING-PONG機能を使っていませんでした。PING-PONG機能とはダブルバッファリング機能のことで、USBエンジンのFIFOに書き出した送信データをUSBホスト側に送信している間に、次の送信データをあらかじめもうひとつのFIFOに貯め込んでおける機能のことです。
上記2点を改善したところ12MBのファイルで
READ: 約15秒 (800KB/sec)
WRITE: 約35秒 (342KB/sec)
というところまでは改善できました。およそ倍ですね。SDとのI/Oは8ブロック(4KB)単位でおこなっていますが、Windows XPからは128ブロック(64KB)単位でのI/O要求がきているようです。したがってマイコン内の処理単位も大きくしてやればさらなる改善も可能かと思われますが、32KBしかないRAMをこれ以上割くのはもったいないので、こんなところで我慢することにしようかと思います。READの方は800KB * 8 = 6.4Mbpsですから、USBフルスピード12Mbpsの半分は出ていることになります。
気がつくと、なんだかんだで1か月くらい複合デバイスやっていたので、いい加減何か違うことやりたくなってきました。