2016年1月6日水曜日

FatFsでBack Write

FatFsでBack Writeっぽいのを実装してみました。つまりCMD24/CMD25のデータをRAMにキャッシングしておき、DMA(と転送完了割り込み)で処理し、その間は他の処理が可能、ということです。Back Writeを使う利点は、ROMにデータを転送している間の時間を他の処理に使用することが可能という点です。



BW転送中のキャプチャです。SPIバスも表示されていますが、SPIクロックが36MHzに対してロジアナは2MHzですからデータは破壊されています。「信号が動いていれば何か転送してるかも」くらいです。もちろん2MHzでは見れない瞬間的な波形は表示されません。

一番下の黄色はメインループでGPIOをトグルしています。その上のオレンジは1msecの割り込みでGPIOをトグルしており、だいたい500Hzになっています。この1kHz割り込みはビジーチェックや転送のキックにも使用しています。

上の画像では4KiBを転送しています。オレンジの波形と比較するとおおよそ30msecで転送終了しているので、転送速度は135Kbyte/sec程度です。これはCMD25のビジーチェックが不適当なためだと思われます。適切に実装すればあと6msecくらいは早くなる気がします。それでも170kByte/sec程度ですけど。
メインループに戻ってメインループが動作しているのは8msecくらいです。転送に必要な30msecのうちの8msecが他に使えるということですから、25%くらいを別に使用可能ということになります。

以前のエントリに書いている転送速度は「f_write + f_syncの時間」です。対して今回の速度はf_mountでFATを開くところから、f_mount(null)でFATを閉じるところまでの時間です。またファイルはFA_CREATE_ALWAYSで開いているので、ファイルサイズを0に変更するための処理も必要になります。データロガーなどファイルは開きっぱなしで後ろに書き加えるだけの場合はもっと早くなると思います。

BWを使用しない場合は転送時間は33msecくらいです。BW使用時はビジーチェックが不適当だと仮定すると、BWを使用しないほうが転送時間は短いはずですが、1割ほど余計に時間がかかっています。BW使用時は30msec-8msecで22msec、BW未使用時は33msecとすると3割ほどCPUリソースを有効活用できるようです。

BWを使用した場合、大量のRAM(大半の時間はこのRAMは未使用)を消費したり、Write中にReadが発生しないように(あるいはその逆が起こらないように)するために様々な配慮が必要だったり、割り込み処理が非常に面倒だったり、とソフトウェアの面ではかなり不利になります。またプログラムも1.3Kほど増えるようです。
BWを有効に活用できるのは非常にメモリに余裕があり、ソフトウェアの開発も十分に専念して行える場合に限られるでしょう。
SDカードの書き込み速度は8KiBくらいをまとめて書く場合で、データロガーの場合はダブルバッファにして文字通り「書き込みが遅れた場合のバッファを確保する」必要があるでしょう。またBWに使用するメモリはFAT操作などもありますから実データ+数ブロック分が必要と思われます。そのためBWを十分に活用するにはRAMはバッファ領域だけでも30Kほど欲しくなります。

今回Back Writeを実装してみて、かなりいろいろな工夫が必要なことがわかりました。この工夫は直接書き込む場合には必要ありませんから、実装にはかなりのコストが必要になります。バックグラウンドで書き込もうとする場合には本当にその必要があるかを考えたほうがいいと思います。

0 件のコメント:

コメントを投稿