0

(このプロジェクトは、おそらくスーパーユーザーまたはエレクトロニクスのサイトで話題になるでしょうが、この質問の焦点は、それを達成するためのプログラム可能なソフトウェアです。)

約 100KB/s でデータを生成する組み込みシステムを使用しており、このデータを保存して後で Windows PC で処理する必要があります。シリアル ストリーミングは機能しますが、内部ストレージには、データ収集が行われる部屋にラップトップやケーブルが存在する必要がないという明らかな利点があります。

私の回路基板には SD カード ソケット (SPI 接続) があり、以前にファイルを FAT ファイルシステムに書き込もうとしました。しかし、これは恐ろしいボトルネックであることが判明しました。特にその理由は、任意の時間に成長する任意の長さの複数のファイルをサポートするために、FAT でのファイル アクセスには、メタデータの複数のレイヤーの読み取りと書き込みが必要になるためです。テーブル自体とディレクトリ -- 実際のコンテンツに加えて、これらはマイクロコントローラの RAM に完全に収まらないため、カード アクセスの数が増加します。さらに悪いことに、新しい空きブロックを見つけるなどの一部のタスクでは、カード サイズが直線的に複雑になります。

FAT に対するもう 1 つの問題は、事前にクリーンなアンマウントを行わないと電源が失われた場合にデータが破損しやすく、私のシステムにはアンマウントを開始できるユーザー インターフェイスがないことです。プロセッサと SD カードを数ミリ秒余分に動かし続けるための停電割り込みやキャパシタンスなどのテクニックは知っていますが、いずれにせよホット リムーブには役立たず、私の既存の回路にはそれらがありません。 m ストレージのクラッシュのみの設計を実現しようとしています。

そこで、ファイルシステムをスキップして、カードをブロックの生のシーケンスとして使用することにしました。ただし、ユーザーがデータを含むカードを再フォーマットするように招待されるのは望ましくありません

ここに画像の説明を入力

そのため、カードをパーティション分割し、OS が認識する小さな FAT パーティションを前面に配置し、説明用のテスト ファイルを配置します。ユーザーがカードを交換できるようにする必要があるため、PC アプリケーション内でパーティショニングとフォーマットのプロセスを自動化する必要があります。

raw アクセスはCreateFile("\\\\.\\PhysicalDisk3")、および同様のパスを呼び出すことで実現できます。これは、管理者権限を必要とせずに、リムーバブル ディスクで実行できます。それでも、これは自分で書く必要のないコードです。また、OS は、変更後にボリュームを再スキャンするように指示する必要があります。

Windows に組み込まれている API や、パーティション テーブルへのビットごとの直接アクセスを必要とせずに SD カードをパーティション分割するためのサードパーティのオープン ソース フレームワークの一部の API はありますか? そうでない場合、パーティション分割を変更した後に Windows でボリュームを再スキャンするにはどうすればよいですか? XP以降で動作する方法を好みます。

4

2 に答える 2

1

あなたの問題は、私が現在私たち自身のプロジェクトの1つで解決しなければならないものとほぼ同じようです.

カードの fat32 ファイルシステムはそのままにしておくことをお勧めします。
ただし、連続ブロックまたはプリキャッシュされた割り当てテーブルを使用して、1 つ以上の大きなコンテナー ファイルを作成します。

これは、組み込みシステム自体でも実行できます。
エルムちゃんのFatF

その後、ファットにさらにアクセスすることなく、コンテナ ネイティブ内のすべてのブロックにアクセスできますが、カードは任意の OS で処理でき、通常のユーザーでもファイルをコピーできます。

連続したコンテナを割り当てるための Smaple 関数:
連続した領域をファイルに割り当てる
そうすれば、ファイルシステム ライブラリなしでブロックにアクセスできます。コンテナへの最初のアクセスのみが開始場所を決定します。

于 2013-11-04T07:21:51.927 に答える
0

Windows がパーティション管理に IOCTL メカニズムを使用しているように見えます。特に、IOCTL_DISK_SET_DRIVE_LAYOUT_EX制御コードは非常に便利です。

さらに調査してから、この回答を更新します。

于 2013-11-03T20:49:00.073 に答える