15

バックグラウンド

私のボードは、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のカードの範囲を試してみようと思います。

4

2 に答える 2

5

最初に試すのは非常に簡単です。キューの深さを640に増やすと、535ミリ秒のバッファリングが可能になり、少なくともこの特定のファイルシステムイベントに耐えられるはずです。

次に確認するのは、ELMFatFの構成です。多くの組み込みファイルシステムは、デフォルトでバッファの使用量が非常に少ないです。すべての操作に単一の512バイトのブロックバッファーを使用し、特定のファイルシステムトランザクションをクロールするものを見たことがあります。私たちはそれに数キロバイトを与えました、そして物事は桁違いに速くなりました。

もちろん、上記の両方は、使用可能なRAMが多いかどうかによって異なります。

3番目のオプションは、巨大なファイルを事前に割り当ててから、データ収集中にデータを上書きすることです。これにより、多くの高価なクラスター割り当てとFAT操作操作が不要になります。

コンパイラの最適化がこれに影響を与えたため、マルチスレッドの問題である可能性も考慮する必要があります。優先度の低いリーダースレッドを妨害する可能性のある他のスレッドが実行されていますか?また、ある種のシステム共振が発生した場合に備えて、そこでのバッファリングをサンプルサイズとフラッシュブロックサイズの倍数以外に変更してみてください。

于 2010-07-22T10:35:52.973 に答える
1

あなた(またはこの質問を読んでいる他の人)は、このFATライブラリを試すことができます:https ://github.com/fernando-rodriguez/fat32lib 。

10 Mbit/sのSPIバスを備えた40MIPSMicrochip dsPIC33では、試したどのカードでも230 Ksps(16ビット)でサンプリングできます。

于 2013-12-29T17:52:06.023 に答える