gombeのブログ

マイコンの電子工作系PIC32/KiCad/C/C++/3D/

MachiKaniaのSDカード読み出しの高速化

WAVの読み出しするときに気がついたんですがSDカードの読み出し遅すぎまあなんというかmicrochip のライブラリを使っているのでしょうがないのかな?とは一瞬思ったのですがオーバーヘッドが大きいのとコードサイズが大きいですね。FatFSだとコードサイズはもちろんのことオプションも豊富なので今後の拡張性が大幅に向上します。最近だと64GBも対応していてさすがだと思いました。

実際にFatFSをつかうとするならば一部書き換えだけで対応できるのですが今回はせっかくなのでセクタリードなどから書いていきます。しかし実際はハードウェアに依存している部分はわずかなので残りの部分は他の方のコードを真似して書くだけです。(あーいけない癖)

SDカードでは内部がブロックによって分割されていて、1ブロックあたり512Bです。たいていの場合このブロックサイズとセクタサイズは一致します。なのでアクセスする際は512バイトごとのセクタアライメントされた状態でアクセスすると高速にアクセスできます。これ以外の場合は必要外のファイルも読み出します。このため二度手間となり速度が低下します。

この問題についてはメモリー構成によって改善することができます。TINYだとバッファリングをせずにそのまま読み出しますので効率が悪いです。ただし読み出し時にセクタアライメントしておけばこのような問題に遭遇することはありません。同様のパフォーマンスを実現できます。

コードサイズについてもELMのリンクに乗ってますがたいていの場合はメーカ製より小さくなり、機能もより増えます。ただし標準入出力ライブラリと互換性はなく、コードに関して相当の箇所を変更する必要があります。

読み出し時の速度についてベンチマークの結果を載せます。以下の結果はおおよそだと考えてください。

1、マイクロチップ社製ライブラリ原型・・・100kB/s

2、マイクロチップ社製ライブラリDMA化・・・200kB/s

3、FatFS、Elm氏のライブラリソフト転送・・・200kB/s

4、FatFS、Elm氏のライブラリDMA転送・・・800kB/s

となりました。マイクロチップ社製ライブラリの性能が悪いのはおそらくファイルシステム部分の性能が悪いためでハードウェア(DMA)で転送してもこの点は改善しませんでした。

逆にFatFSではノーマルではほぼオーバーヘッドは改善され、送信のソフトに処理の時間が移り、その結果DMA化した時に速度が大幅に向上しました。

FatFS+DMAでビデオ出力をしました。

https://github.com/elect-gombe/Video_onMachiKania

パフォーマンスが素晴らしいです。