[PSoC Advent Calendar 2016 16日目] SDカードライブラリの比較

2016/12/16

PSoC 5LP 製作

SDカードへの書き込みはデータロガーに必須の機能かつ性能に深く関わる重要な要素であるので、これまでに何度かSDカード周りのテストを行い、関連記事も書いてきました。
PSoC 3/5/5LPではじめてSDカードを扱ったのはPSoC 3 ES3が出始まった時期で、その頃のPSoC Creatorには標準のSDカードライブラリがなかったため、FatFsを自前で移植して利用していました。
その後しばらくしてemFileが利用可能になりSDカードの扱いはかなり楽になりましたが、主に速度面での性能差が知りたかったため、emFileとFatFsの比較も行いました。

今回の話はその続編のようなものです。
その存在に気がついたのはつい最近なのですが、PSoC 3/5LPで利用可能な新手のSDカードライブラリNSDSPIが現れたので、emFileとの性能比較を行ってみることにしました。
NSDSPIはデータの転送にDMAを用いているため、速い読み書きが期待できます。

テストはCY8C5888AXI-LP096を搭載するHPA_Navi IIIを使って行いました。
前回のテストとの比較を容易にするため、CPUクロックは50MHz、SPIクロックは12.5MHzに設定しています。
使用したmicroSDカードはGigastone製の2GByteのものです。
最も単純な書き込みと読み込みのテストを行い、その速度を比較しました。
NSDSPIのテストにはNSDSPI付属のComponentTestのピン配置とクロック周りをハードウエアに合わせて変更したものを利用しました。
また、emFileのテストはNSDSPIのテストに用いたプロジェクトのSDカード関連関数をemFileのものに書き換えて行いました。

転送するデータサイズを変えて行った読み書きテストの結果を以下に示します。
データサイズは2^Nバイトとし、FatFsが内部で利用するバッファサイズの512byte以上かつ8192byte以下で行いました。
計測は1ms単位でしか行っていないので、速度には多少の誤差が含まれていると思います。
書き込み速度の比較
読み込み速度の比較
コンパイル条件が同じ場合にNSDSPIとemFileの速度を比較すると、読み書き共におおむね同程度のようです。
また、Debugモードでコンパイルを行った場合の結果から、DMAを有効にすることで読み書きの速度が大幅に向上することがわかりました。
さらに、コードの最適化という意味では不利な条件にもかかわらず、今回試した範囲では最も高速に読み書きできていることがわかります。

今回試した限りだと、NSDSPIのDMAモード動作にはどこか問題があるらしく、Debugモードでビルドした場合のみに動作が確認できました。
また、動作するクロックにも制限があるのか、CPUクロック50MHz、SPIクロック12.5MHzの場合に動作が確認できたものの、たとえばSPIクロックを10MHzに下げるなどするとうまく動かなくなってしまいました。

今回のテストで用いたプログラムでは利用範囲に制限がありましたが、DMAの利用でSDカードの読み書きがかなり高速化できることがわかりました。
HPA_Navi IIIでうまくNSDSPIが利用できればシステムの負荷が軽減できそうなので、どこに問題があるのかを調べてみたいと思います。

テストに利用したプロジェクト類はライセンス周りを確認の上、後日githubで公開しようと思います。