STM32F746DiscoでのSDカードデータ転送速度

STM32F746DiscoでSTM32CubeIDEプロジェクトを通じてSDカードを扱う“で作ったプロジェクトでのSDカードのデータ転送速度を確認してみます。

手元にある正体不明の2GBマイクロSDカードは最低限Class2、2MB/sではあるはずです。

一応CrystalDiskMarkで確認してみると

シーケンシャルライトでも最低3.15MB/sでした。ランダムライトがやけに遅いですが本題でないのでスルーします。

ではSTM32CubeIDEに実装していきましょう!!!

まず測定用の変数を用意します。

速度を測るためf_write()、f_read()前後にHAL_GetTick関数を入れます。

速度測定コードの最後のUNUSED(…)は(void)…のマクロでbuild時にWarningを出させないためのものです。

また”STM32F746DiscoでSTM32CubeIDEプロジェクトを通じてSDカードを扱う“でのwtextでは文字列が少なくf_write()、f_read()のオーバーヘッド部分が大きすぎて真の速度がわからないのでもっと大きくしてみます。

そしてwtext、rtextが分かれているとサイズを2倍とってしまうのでwtextのみにします。つまりwtextを書いてwtextに読み込みます。ちなみにSTM32F746DiscoveryのRAMサイズは320kbyteです。

このwtextをStartDefaultTask()内に置いておいたままだとTaskサイズが足らなくなるので外に出します。

wtextのサイズはとりあえず200kbyteです。text分はasciiコードなので1文字=1byteですので200kbyte=200k文字数になります。char配列サイズを+1しているのはヌル文字分です。

いきなり200kbyte分のwtext文字列を作るのは大量の文字列になるのでstrcatで文字列を生成します。その生成用にwtextSrc、wtextSrc2を用意します。2つ用意するのはいきなりwtextSrc→wtextだと処理時間が掛かってしまうのでいったん中規模のwtextSrcwを作ってそこからwtextを作っているためです。

あとstrcatするので<string.h>をincludeします。

wtextを生成するコードをf_writeの前に付け加えます。

では走らせてみましょう。

f_write、f_readのオーバーヘッドを取り除くためにデータサイズをいくつか変えてみて何回かの平均をとってみました。

転送データ量(kbyte)10100200
ライト時間(ms)(3回平均)1444.3376.33
リード時間(ms)(3回平均)4.3318.33332.67

転送速度

ここから近似式y=ax+bの係数a,bを計算してみます。

aはExcelのSLOPE(範囲)、bはINTERCEPT(範囲)で計算できます。

計算結果は

ライト

a=0.328ms、b=11.00ms

リード

a=0.149ms、b=3.05ms

この近似式から再計算した値を再度さきほどの表に入れてみます。

転送データ量(kbyte)10100200
ライト時間(ms)(3回平均)1444.3376.33
近似式からのライト時間(ms)14.2843.8076.59
リード時間(ms)(3回平均)4.3318.3332.67
近似式からのリード時間(ms)4.5417.9432.85

係数aを転送速度に変換してみると

ライト

1kbyte/0.328ms≒3.05Mbyte/s

リード

1kbyte/0.149ms≒6.71Mbyte/s

となります。

オーバーヘッド時間はbそのものなので

ライト

11.00ms

リード

3.05ms

となります。

ちなみに最適化をなし(-o0)から最大(-o3)まで変えてみましたが結果は大差なかったです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です