バックグラウンド
私のボードは、SPIにSD / MMCカードを備えたSTM32マイクロコントローラーを組み込んでおり、48 ksamples/sでアナログデータをサンプリングします。Keil Real-timeLibraryRTXカーネルとELMFatFを使用しています。
40サンプル(40 x 16ビット)のブロックでDMAを介してアナログデータをキャプチャする優先度の高いタスクがあります。データは、長さ128のキュー(約107ミリ秒のサンプルバッファリングを構成)を介して、サンプルブロックを2560バイトのバッファ(これは512バイトのSDセクターサイズと40サンプルブロックサイズ)。このバッファがいっぱいになると(32ブロックまたは約27ミリ秒)、データはファイルシステムに書き込まれます。
観察
コードをインストルメント化することにより、32ブロックごとにデータが書き込まれ、書き込みに約6ミリ秒かかることがわかります。これは、(FAT16で)ファイルサイズが1 MBに達するまで維持され、書き込み操作に440ミリ秒かかると、キューがいっぱいになり、ロギングが中止されます。カードをFAT32としてフォーマットすると、「long-write」イベントの前のファイルサイズは4MBになります。
これが発生するファイルサイズがFAT16とFAT32の間で変化するという事実は、それがカードの制限ではなく、ファイルシステムが1MBまたは4MBの境界で行うことであり、追加の時間がかかることを私に示唆しています。
また、私のタスクはタイムリーにスケジュールされており、ELMFatFsコードでは1MB(またはFAT32の場合は4)の境界でのみ時間が消費されているようです。
質問
説明や解決策はありますか?それはFATの問題ですか、それともELMのFatFsコードに固有の問題ですか?
複数のファイルを使用することを検討しましたが、私の経験では、FATは単一のディレクトリ内の多数のファイルをうまく処理できず、これも失敗します。ファイルシステムをまったく使用せず、カードにrawで書き込むことも可能ですが、理想的には、標準のドライバーを使用し、特別なソフトウェアを使用しないPCでデータを読み取りたいと思います。
書き込み時間を短縮するためにコンパイラの最適化を試みることに気づきました。これは効果があるように見えますが、書き込み時間ははるかに変動しやすいように見えました。-O2で8MBのファイルを取得しましたが、結果に一貫性がありませんでした。ファイルサイズと失敗するポイントの間に直接的な相関関係があるかどうかは今のところわかりません。私はそれが特定の境界のないさまざまなファイル長でこのように失敗するのを見てきました。たぶんそれはカードのパフォーマンスの問題です。
私はさらにコードをインストルメント化し、分割征服アプローチを適用しました。この観察はおそらく質問を時代遅れにし、以前のすべての観察は誤りであるか、または赤ニシンです。
最後に、マルチセクター書き込み(CMD25)のインスタンスに絞り込みました。この場合、カードの「待機準備完了」ポーリングに、5のブロックのうち最初の3セクターで174ミリ秒かかることがあります。待機準備完了のタイムアウトは次のように設定されます。 500ミリ秒なので、楽しく忙しいでしょう-そんなに長く待ってください。CMD24(単一セクター書き込み)を繰り返し使用すると、一般的なケースでは、たまにではなく、セクターあたり140ミリ秒とはるかに遅くなります。
結局のところ、それはカードの振る舞いのようです。SDとMMCのカードの範囲を試してみようと思います。