問題タブ [fat]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - ファイルアロケーションテーブルの読み取り
私はカスタムFATファイルシステムエクスプローラーに取り組んでおり、状況は非常に順調に進んでいます。ただし、チェーンマップに対して効率的に読み取り/書き込みを行うためのより良い方法があるかどうかを知りたいです。大型デバイスの場合、これは非常に多くのリソースを消費する可能性があり、非常に遅くなる可能性があります。特に割り当てスペースの場合。
これが私がそれを読む方法です:
チェーンは数百メガバイトになることもあります。
そして、これが私がそれを書く方法です。chainMap uint配列への割り当てと変更が行われると、基本的にそのuint配列をループし、チェーンマップ全体を書き換えます。
私はキャッシュシステムに取り組んできましたが、これをより良くする方法についてもう少しアイデアが欲しいです。
filesystems - SDカードを使用して16ビットデータを48ksamples/ sでログに記録するにはどうすればよいですか?
バックグラウンド
私のボードは、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のカードの範囲を試してみようと思います。
backup - FAT ファイルシステムの増分 tar バックアップを実行する方法
私はtar --listed-incremental=...
自分のコンピューターで増分バックアップを実行していましたが、ほとんどの場合、それは魔法のように機能します。ただし、古い FAT パーティションではうまく動作しないようです。すべてのファイルが変更されたと考え、すべてをバックアップします。tar の増分バックアップは inode に依存しているとどこかで読んだことがあります。そのため、FAT ではうまく機能しません。それを偽造する方法、またはinodeの代わりに名前と変更日を使用するように強制する方法はありますか?
c - FATファイルシステムと大量の書き込み
組み込みデータロギングアプリケーションにFATファイルシステムを使用することを検討しています。ロガーは、毎分40バイトのデータを継続的に追加するファイルを1つだけ作成します。数年の使用後、これは100万回を超える書き込みサイクルになります。私の質問は:FATシステムはファイルが追加されるたびにファイルアロケーションテーブルを変更しますか?ファイルの終わりがどこにあるかをどのように追跡しますか?EndOfFileマーカーを最後に配置するだけですか、それとも長さをFATテーブルに格納しますか?書き込みを行うたびにFATテーブルが変更される場合は、わずか2、3年でフラッシュメモリを使い果たしてしまいます。FATシステムはこのアプリケーションに使用するのに適切ですか?
もう1つの考えは、生データのバイトをメモリカードに保存し、書き込みを行うたびにデータの最後にEndOfFileマーカーを配置できるということです。ただし、これは、ロガーからデータを取得する唯一の方法がPCやカードリーダーではなくシリアル転送を介することを意味するため、あまり望ましくありません。
filesystems - FAT32 フォーマットのストレージ上のファイルシステム リンク
FAT32 も FAT16/12 もシンボリック リンクもハードリンクもサポートしていないことは知っています。しかし、私はこのアイデアを思いつきました:
FAT 仕様では、すべてのファイルがディレクトリ エントリに関連付けられていると説明されています。私の理解では、ディレクトリ内のファイルエントリは、何らかの形でファイルの内容を指していると言えます。
では、同じファイル コンテンツを指す 2 つのディレクトリ エントリを定義するにはどうすればよいでしょうか。または、私がそうするのを妨げるものは何ですか?
使用例:カー ラジオ用の USB 大容量ストレージ デバイスがあり、ラジオ ソフトウェアがプレイリストをサポートしていないため、ディレクトリをプレイリストとして使用したいと考えています。したがって、これを行うときに Windows がどのように動作するかは、私にとって重要ではありません。
c - ARMを使用したCプログラミング-ファイルへの構造体の出力と入力
作成しているプログラム内の構造体に少し問題があります。バックグラウンド; ARMv7チップ上でCでコードを開発しています。システムには、ファイルアクセス用のFAT16ファイルシステムを備えたSDカードがあります。FAT16ファイルの読み取りおよび書き込み操作用のライブラリを使用して、ファイルの出力/入力を処理しています。現在、main関数の前に構造体をグローバルに宣言しています。
ポインタは文字列用です。たとえば、&config.nameを使用して、これらの変数にデータを読み込みます。シリアルポートを介して受信した文字を別のcharポインターに読み込んで、別の文字にstrcatするために作成した関数を使用する必要がありますが、これは正しく機能し、ユーザーが入力した詳細が記録された入力と一致することを確認しました(クイックがあります)誰かが疑問に思っていた場合に詳細を求めるプロンプトを表示するためのターミナルウィンドウのプロンプト画面)。
次に、提供されているライブラリ関数を実装して、構造体をファイルに保存します。
CONF_FILEは使用するファイルの単なるファイルハンドルであり、&configは出力バッファーであり、READBUFSIZEはバッファーのサイズです(148として定義され、私の目的には十分な大きさですが、後で構造体のサイズを計算するために変更したいと思います。出力し、ファイルサイズを計算して、正しく読み戻すことができるようにします)。明確になっていない場合に備えて、参照用にライブラリによって提供される関数定義を最後に冒頭陳述とともに追加しました。
これは完全に機能し、ファイルの出力は次のとおりです。Name1.1192.168.1.1に空白がたくさんあります。明らかに、名前としてNameを入力し、ファームウェアとして1.1を入力し、IPは自明です。
素朴に、私はこれを使って宣言したloadconfig構造体にそれを読み戻すために逆を行うことができると思いました。
構造体には、読み戻す量を知るための事前定義されたサイズがないため、明らかにこれが機能する見込みはありません。
では、保存したデータを元の構造体と同じ構造体に戻すにはどうすればよいでしょうか。名前は、大規模ではなく、任意のサイズにすることができますが、安全に予測することはできません。FWバージョンは#。#のみになり、IPは明らかにすでに定義された制限内にあります。
正しい方向へのヒントや微調整をありがとう。範囲を理解するためにさらに情報が必要だと思われる場合は、お問い合わせください。
参考のために;
assembly - アセンブリ言語でFATテーブルを読む方法
NC - Norton Commander NC のようなプログラムを作成する必要があります。プログラム内のファイルとディレクトリを表示するには、Assembly の Fat Table にアクセスする必要があります。アセンブリ (フロッピーとハードディスクの両方) で Fat にアクセスする方法を知っている人はいますか?どの割り込みを使用すればよいですか?
前もって感謝します。
assembly - ファイルの最初のクラスターによって、次のクラスターのヒントを読み込むものを FAT がどのように通知するのですか?
私はbrokenthornのOS Devチュートリアルを読んでいます
http://www.brokenthorn.com/Resources/OSDev6.html
私はこれに数日間立ち往生しました。;
「stage2.sys」を読み込み、
ルートディレクトリ「stage2 sys」を検索します。
ルート ディレクトリには、ファイル名と開始クラスタ アドレスが含まれます (つまり、0x002)。
0x002 番目のクラスターをロードし、FAT を検索して次にロードするクラスターを探します。
FAT は 12bit 配列と
配列サイズは 4077 です
今のところ、ファイルの最初のクラスターによって次のヒントをロードするものを FAT が教えてくれる方法がわかりません。
問題はこれです。
不足している点や間違っている点はありますか?
ファイルの最初のクラスターによって、次のクラスターのヒントを読み込むものを FAT がどのように通知するのですか?
FAT は 12 ビット配列だけで構成されています。
ありがとう。
sd-card - SDHC カード SPI 初期化
現在、SDSC v1 カードのみをサポートする組み込みシステムに取り組んでいます。2 GB 未満のカードを見つけるのがますます難しくなってきているので、SDHC カードのサポートを追加しようとしています。カードとの通信は、SPI バスを介して行われます。
したがって、カードを初期化するために私が行っていることは次のとおりです。
- CMD0 を送信します。カードが 0x1 を返す
- CMD8 + 0x1AA を送信します。カードは 0x1 と 0x1AA を返します
- ACMD41 を送信します。カードは 0x0 を返します。
その後、MBRを読み取り、 0x30 LBAに FAT16 パーティションがあることがわかりました。ただし、そのアドレス (0x30*512) からセクターを読み取ると、0x01 0x09 の繰り返しが返されます...
- ACMD41 を送信するとき、コマンド ID 0x69 を送信しています。それが正しいか?または、CMD55 を送信してから CMD1 を送信する必要がありますか?
- 図1は、ACMD41 を送信した後に CMD58 と、場合によっては CMD16 を送信する必要があることを示しています。それは必要ですか?それらを行わなくても、有効な MBR を読み取ることができました。
macos - OSX Snow Leopard:32ビットおよび64ビット用のビルドブースト1.47.0
私は夢中になっています...私は現在、osxユキヒョウのプロジェクトのブーストを1.44.0から1.47.0にアップグレードしようとしています。-次のコマンドでビルドしたいと思います。
ここで、i386とx86_64をサポートする静的ファットビルドが提供されると期待しています。とにかく、結果のライブラリをクエリすると、それらはすべてx86_64であるため、明らかにそうではありませんlipo -info
。-これを解決するにはどうすればよいですか?ビルドスクリプトが壊れている可能性がありますか?