予期しない電源障害からSDカードを保護するにはどうすればよいですか?


18

Microchip MDDFSライブラリを使用してデータをSDカードに保存するデバイスで作業しています。ロガーは、毎分1エントリー(56バイト)の最大速度でデータを記録します。問題は、潜在的に書き込みシーケンスの途中で、デバイスの電源が失われる可能性があることです。破損からデータを保護する最善の方法は何だろうと思っています。電源が切れたときにファイルが開いていると、最後のファイルを閉じた後にファイルに書き込まれたすべてのデータが失われることがわかりました。書き込みシーケンスの途中で電力が失われた場合、同じことが当てはまるかどうかはわかりません。

書き込み手順はあまり頻繁に行われないため、データが記録されるたびに、ファイルを開いてデータを書き込んでからファイルを閉じることができました。このアプローチは、時間の経過とともにsdカードに損傷を与えますか?

別のアプローチとしては、ファイルを開いたままにすることもできますが、10回または50回書き込みを行うたびに、ファイルを閉じてから再度開くことができます。

また、メモリにデータをバッファリングし、場合によってはキロバイト程度でデータをフラッシュすることもできます。

私の最後のアイデアは、回路に大きなコンデンサを追加して、電源が切断されてからすぐにファイルを閉じるために十分な時間、pic / sdカードに電力を供給することでした。このアプローチの問題は、ファイルを閉じたりデータを保存するのにかかる時間が非常に一貫していないことです。私の理解では、この時間は、ファイルが存在するフラッシュページの現在の場所に大きく依存します。

とにかく、皆さんは何を提案しますか?


2
最小限のファイルシステムで生のNANDフラッシュに切り替えた場合、現在の多くの抽象化レイヤーをドリルスルーして、小さな書き込みをコミットする機能を妨げ、データが利用可能になったときにすぐに部分的なブロック書き込みを実行できる可能性があります。また、エンドユーザーがさまざまなパフォーマンスの詳細を持つカード(代替のグレーマーケットのものでさえも)を代用するのを防ぐこともできます。
クリスストラットン

回答:


16

ファイルにデータを書き込むと、いくつかのことが起こります。必ずしもライブラリ呼び出しではなく、データを安全にするために発生する必要があるシーケンスを説明します。

書き込み中にファイルの最後に追加する場合(通常の書き込みモード)、ファイルの最後のブロックをメモリに読み込み、書き込みデータで変更してから、ブロック全体をSDカードに書き戻します。 。ブロックがいっぱいの場合は、ファイル割り当てテーブル(FAT)で新しいブロックを見つける必要があります。新しいブロックを見つけた後、FATを更新する必要があります。これは、読み取り-変更-書き込みサイクルです。ファイルの処理が完了したら、ルートディレクトリのファイル属性(ファイルの長さなど)を更新する必要があります。これにより、別の読み取り-変更-書き込みサイクルが発生します。

書き込み時間を最小限に抑える

  • セクタを書き込むときは、ファイルがすでにデータを保持していることを確認してください。大きなファイルから始めて、データを追加する代わりにデータを上書きする場合、SDカードセクターの書き込みが終了するとすぐにデータは安全になります。そのようにして、1回から2回の読み取り-変更-書き込みサイクルを排除できます。私の起動コードは、SDカードがいっぱいになるまで、セクターの増分でファイルに0を書き込み、ファイルの先頭まで巻き戻します。

  • データエントリのサイズを、整数のエントリがセクタに収まるようにします。エントリを64バイトに増やします。これはあまり効率的ではありませんが、2つのセクターの読み取り/変更/書き込みを行う必要がなくなります。

  • セクター全体を書き込むことができるFSwrite関数のバリアントを作成します。セクタ全体をSRAMに保持する場合、サイクルは「read-modify-write」から「modify-write」に移行します

PICとSDの電源を可能な限り長く保つ

  • 大きなコンデンサは良いです。470uFは、書き込みサイクルを完了するのに十分な電力を提供するはずです。

  • 電源がバックアップコンデンサから電力を消費しないようにしてください!必要に応じてダイオードを追加します。

いつ停電になるかを知る

  • 電源キャップが大きいと、10ミリ秒以上でSDカードで物事をまとめることができますが、運を圧迫しないでください。マイクロコントローラのピンを使用して、電源がまだ良好かどうかを確認し、電源が停止している場合は書き込みを開始しないでください。

情報をありがとう。非常に役立ちます。私は...私はそれで何ができるかがわかります
PICyourBrain

4GBのカードにすべてゼロを書き込むのにどれくらいかかると思いますか?長い時間のようです。また、fswrite関数を変更してセクター全体への書き込み全体を許可するために共有できるコード例はありますか?
PICyourBrain

また、ファイルにすべてゼロを書き込んだ場合。実際のデータの終わりがどこにあるかをどのように追跡しますか?最初にすべてのデータを読み取り、ゼロの文字列を見つけましたか?
PICyourBrain

1
FAT16を使用している場合、2GBに制限されていると思います。SD / MMCカードには「ブロックの消去」機能があり、MDDFSライブラリには実装されていないようです。SDカードプロジェクトに独自のコードライブラリを使用したため、コード例を共有できません。最後のデータを見つけるには、データレコードですべて0が見つかるまで読み取る必要があります。データレコードがすべて0になる可能性がある場合は、ゼロ以外のデータ、またはある種の区切り文字を追加することをお勧めします。
W5VO

6

SDカード(またはMMC、CompactFlashなど)でまだ言及されていない問題の1つは、SDカードはホストからは任意の順序で読み書きできる512バイトセクターの単純なコレクションとして見えることですが、フラッシュデバイスは一般的に528バイトのページをそれぞれ32 KBのグループに格納します。サポートされる操作は、それ以外の場合は空白のページに書き込むか、グループ全体を消去することだけです。この制限に対処するため、SDカードのコントローラーは、論理セクターを物理ページにマッピングできるテーブルを保持します。セクターの書き込み要求が行われると、コントローラーはチップ上のどこかに空白ページを見つけ、問題のセクターの新しいアドレスでマッピングを更新します。空白のページが不足している場合、または他のさまざまな時点で、

これの重要性は、特定の論理セクターへの書き込み動作では、多くの論理セクターからのデータをシャッフルする必要がある場合があることです。そのプロセスで問題が発生した場合、カードが書き込むように要求されたセクターだけでなく、任意のセクターが破損する可能性があります。優れたSDカードコントローラーは、データシャッフル中に電力が失われた場合に、操作のどの部分が完了し、どの部分が完了していないかを把握できるように、データシャッフル操作を実行するように設計する必要があります。その結果、操作を適切に完了することができます。残念ながら、ディスカウントストアで購入した5ドルのSDカードがその点で良いかどうかをどのように判断できるかわかりません。

確かに、SDカードが完了したと報告されたすべての書き込み操作が実際に電源障害に耐えることを保証するという観点から完全に完璧であっても(つまり、すべての作業が書き込み電力が再投入されたときにカードが動作を終了するのに十分なだけ完了しました)、ホストオペレーティングシステムが意図したデータ書き込みのすべてではなく一部を実行した場合に問題が発生するわけではありません。それにもかかわらず、SDカードが「お買い得」の終わりを維持できない場合、電源障害によるデータ損失を防ぐためにホスト側ソフトウェアで実行できることは何もないことに留意することが重要です。


それは非常に洞察力に富んだコメントです。
フレッドバセット14

5

また、ある種のチェックサムを使用して、読み取りが必要ときにSDのデータが正しいことを確認することもお勧めします。


3

おそらく、Sparkfunのこのスーパーキャパシタが問題を解決するでしょう。


2
PICのメモリを保持しますが、最大電流定格は10uAです。私はあなたがそのくらいの電流でSDカードに書き込むことができるとは思わない。
W5VO

1
コンセプトは良いです。Illinois Capacitor(illinoiscapacitor.com)には、最大8 Fのスーパーキャパシタがあり、最大4 Aの電流をサポートできることが簡単に検索されました。主電源に障害が発生した場合、うまくいきます。
ザフォトン

3

書き込み手順はあまり頻繁に行われないため、データが記録されるたびに、ファイルを開いてデータを書き込んでからファイルを閉じることができました。このアプローチは、時間の経過とともにSDカードにダメージを与えますか?

エンジニアリングの問題と同様に、ここでトレードオフに対処する必要があります。

データがまったく失われないことが重要ですか? その後、上記を行います。カードを破壊するよりもデータを失う方が、より多くの損害を被ることになります。ある種のストレステストを実行して、カードが破損するまでにその操作を何回実行できるかを判断できます。カードが使い物にならなくなるまでにかかった時間の長さであなたがクールで、カードを変更する前に許容できる時間の長さのようであれば、私はそのルートで行きます。


1

データを保存するだけの場合、ファイルシステムは必要ありません。書き込み操作は、ブロックアドレスを選択することにより、SPIを介して直接実行されます。これにより、書き込み時間を最小限に抑え、データ破損のリスクを軽減できます。

電力が失われ、運がなかった場合でも、1つのエントリだけが失われます(システムによっては許容される場合があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.