3

私は、多数のワイヤ(最大360)をテストできる組み込みシステムを開発しています。これは基本的に導通チェックシステムです。システムは、テストベクトルをクロックインし、もう一方の端から出力を読み取ることによって機能します。次に、出力は、出力がどうあるべきかを示す保存された結果(SDカードにある)と比較されます。テストベクトルはただ歩くものなので、どこにでも保存する必要はありません。プロセスは次のようになります。

  1. テストベクトルをクロックアウトします(ウォーキングのもの)
  2. 出力テストベクトルを読み込みます。
  3. SDカードから対応する出力テストベクトルを読み取ります。これにより、出力ベクトルがどうあるべきかがわかります。
  4. 手順2と3のテストベクトルを比較します。
  5. 別のアレイにエラー/障害を書き留めます。
  6. すべてのワイヤがチェックされていない限り、手順1に戻ります。
  7. エラー/障害をLCDに出力します。

私のハードウェアは、AVRマイクロコントローラーにクロックインされる大きなシフトレジスターで構成されています。すべてのテストベクトル(これも360ビットになります)について、360ビットで読み取る必要があります。したがって、360線の場合、データの総量は360 * 360=16kB程度になります。これを1回のパスで実行できないこと(つまり、データ全体を読み取ってから比較すること)ができないことはすでにわかっているため、テストベクトルごとにテストする必要があります。

このような大きな数を保持できる固有のタイプはないため、長さ360ビットのビット配列を使用する予定です。さて、私の質問は、このビット配列をtxtファイルにどのように保存する必要があるかということです。

1つの方法は、生の値を格納することです。つまり、各行に、シフトレジスタから読み込んだ生のバイナリデータを格納します。したがって、8線の場合、0b10011010になります。ただし、これは最大360本のワイヤでは見苦しい場合があります。各行には360バイトが含まれます。

もう1つの方法は、16進値を格納することです。これは、8ビットの場合は2文字(上記の場合は9A)、360ビットの場合は約90文字になります。ただし、これには、テキストを1行ずつ読み取り、16進値をビット配列で表されるように変換する必要があります。

では、この種の問題に対する最善の解決策は何でしょうか?完全に「決定論的」なソリューションが必要です。mallocなどを呼び出すことはできません。私が読んだことから、これらは組み込みシステムでは少しノーノーです。

まとめ

従来の変数型では表現できない大きな値を格納する必要があります。現在、これらの値をビット配列に格納する予定です。これらの値をSDカードのテキストファイルに保存するための最良の方法は何ですか?

4

1 に答える 1

6

これらは整数値ではなく、ビットマップです。算術的な意味はありません。あなたが提案しているのは、単に長さ360/8のバイト配列であり、「大きな整数」とはまったく関係ありません。ただし、より適切なデータ構造または表現が可能な場合があります。

テストベクトルが360のシングルビットである場合、各ベクトルに360ビットを格納することは非効率的であり、不要です。各ベクトルを明確に定義するには、0〜359の値で十分です。正しい出力も単一ビットである場合は、ビットインデックスとして保存することもできます。そうでない場合は、設定する必要のある各ビットのインデックスのリストとして、番兵値>=360または<で保存できます。 0はリストの終わりを示します。ほとんどのベクトルに含まれるセットビットが22未満の場合、この構造は45バイトの配列を格納するよりも効率的です。

任意のビットインデックス値から、次の方法で個々のワイヤのアドレスとマスクを決定できます。

byte_address = base_address + bit_index / 8 ;
bit_mask = 0x01 << (bit_index % 8) ;

360ビットのそれぞれを繰り返しテストするか、ビットのリストからその場で360ビットベクトルを生成することができます。

これでは動的メモリ割り当ての必要性はわかりませんが、組み込みシステムで動的メモリ割り当てが推奨されるかどうかは、アプリケーションとターゲットリソースに大きく依存します。一般的なAVRシステムにはメモリがほとんどなく、動的メモリ割り当てには、ヒープ管理とブロック調整のオーバーヘッドがあり、余裕がない場合があります。動的メモリ割り当ては、ハードリアルタイムの決定論的タイミングが必要な状況には適していません。また、すべての場合において、メモリリークの問題を回避するための明確に定義された戦略またはアーキテクチャを用意する必要があります(解放されないメモリを繰り返し割り当てる)。

于 2011-12-26T11:05:27.573 に答える