2014年12月12日(金) 22:06
SD書き込みは、頭がおかしくなりそうなほど複雑な処理を行っているが、最終的にはSTM32のSDIO関係の処理に行き着く。
ペリフェラルの直接操作関連は、stm324xg_FatFs_sdio_sd.c にまとめられている。
この中で、処理完了待ちのループが絡むのは、3箇所。
CmdResp1Error
ステイタスレジスターの変化を待っている。
レジスターの値が変化しなかった場合、無限ループに入る。
変化が保証されているとしても、変化するまでの時間は不明。
SD_WaitWriteOperation
SD_WaitReadOperation
いずれも、ループカウンターを減らしつつ処理完了待ちしている。
カウンター初期値を変えることでタイムアウトの変更が可能。
これらはライブラリーに相当するため、手を加えるのは気が進まない。ライブラリーが更新されたり、上位マイコンに乗り換えたりした場合に、手を加え直さねばならなくなり保守性が悪化する。
ただし手を加えるのは3箇所だけであり、タイムアウトを明示的に例えば5ミリ秒にするとか簡単な修正である。やってやれない訳じゃない。
だが、かなり筋が悪い。SD書き込みでは、読み書きいずれも何度も発生するため、処理完了待ちの間に別の処理を行うのは困難である。ライブラリーに手を加えて保守性を落とした上に、正統ではない手法でマルチタスクやったのではバグの温床になりかねない。それも、取るのが困難なバグだ。
読み書きが不規則に何度も発生するのは、ファイルシステムの存在が大きい。
SDカードでは、512バイト単位でアクセスするのが一般的なようだ。それより小さなデーターを書き込むとか、データーが512バイト境界をまたぐとかすると、管理領域へのアクセスが増える。おかげでパソコン等なら手軽にファイルという形でデーターを扱えるので、ハンドリングが良くなっている訳だが。
それに加えて、記憶媒体がフラッシュメモリーである点が影響する。フラッシュメモリーは、256バイト単位でしか書き込みを行えない。更に、消去済みの領域でないと書き込めない。それらの制約が絡んで、やたらめったら複雑なプログラムになる。
まてよ、だったら常に512バイトずつ書き込んだらどうだろう?
試してみると、書き込み時間が約6ミリ秒でほぼ一定となった。しかし完全に一定ではなく、突発的に長時間を要する場合がある。理由は、データー消去を行わねばならなくなる場合があるからだろう。SDカード全体をクイックフォーマットではなく完全消去済みしておけば、データー消去ラグは無くなると期待できる。しかし、それでは使い勝手が著しく悪くなる。最初からファイルシステム使わずに、物理番地に直接書き込む方がマシだ。
それに、1回の書き込みに6ミリ秒は長過ぎる。
処理ループ1回は、16〜17ミリ秒である。
これを、センサー読み取り5ミリ秒以内でカルマンフィルター等の計算に10ミリ秒という見当で考えている。
すると、SDカードの書き込みが6ミリ秒どころかその半分でも、時間を食い過ぎだ。書き込み中は別の処理をできないので、許せるのはせいぜい1ミリ秒である。とてもじゃないが、無理だ。
written by higashino [マルチローター] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]
Generated by MySketch GE 1.4.1
Remodelling origin is MySketch 2.7.4