2012-02-18 20 views
1

私はSPI経由で40バイトのビット配列を読み込むuC用のプログラムを開発しています。この40バイトの配列は、SDカードに保存されている「既知の良い」テストベクトルと比較されるテストベクトルです。Malloc、可変長配列または静的配列?

異常/フォルト/エラーを見つけるために、受信したテストベクトルのすべてのバイトを格納されたデータとXORします。これにより、フォールトが存在するビット配列が '1'にな​​ります。私はこれらの1の位置を、次のようにして簡単に見つけることができます。algorithm

問題は、これらの '1'の位置を保存しています。現在、私は可変長配列を使用していますが、GCC4.2ではこれらのサポートが壊れていますので、AVR-GCCでどれほど信頼性が高いのか分かりません。

私の次の考えはmallocですが、これは通常組み込みシステムではお勧めできません。私はちょうど長さ320のunsigned char配列を宣言し、ビットセットが見つかると '1'を格納するべきですか?例:ビット配列にビット4,8,10,42、および250が設定されています。次に、対応する要素を '1'に設定して、これらの位置で '1'が検出されたことを示します。これはSRAMの320バイトを占有します。あるいは、配列をintとして宣言し、実際の位置を配列の先頭から格納することもできます。

なぜビットの位置を設定する必要がありますか? SDカードには、ビット配列内の位置に対応する情報を持つ別のファイルが含まれています。したがって、位置24で障害が検出された場合、プログラムはファイルを読み込んで、位置24に接続されていることを知っているすべての情報を表示できます。

注:一部のテストでは、すぐにベクトル。それは確かに事実です。

答えて

3

ストレージの上限がわかっていて煩わしいことがなければ、通常は固定サイズのアレイを作成する方が良いでしょう。

説明したように、可変長配列のサポートは実装によっては問題があり、他の実装ではまったく使用できません。 mallocにはオーバーヘッドが追加されており、失敗する可能性があります。

私は、アレイ(staticは、私が思うに、ここで使用するための紛らわしい用語である)非可変長固定サイズのために行くと思います。


さて、あなたはそれぞれの値が同等のビットが不良である、または各要素が不良ビットの逐次リストである整数配列は別の問題であるかどうかを指定する文字列を使用するかどうかの。

最初は、16ビット値を使用して2番目のケースの使用でデータを最小化しようとしていますが、これはshortであるかわからない実装ではintです。

しかし、あなたは320ビットを有するので、8ビットの文字は、ビット位置のために動作しないので、16ビットの値が必要とされます。

したがって、その第二の場合のために、あなたは、試料中のすべてのビットが悪い、最悪の場合のために、640のバイトではなく320を使用する必要があります。この配列の未使用スロットに-1の値を格納することで、不良ビット数が不要になります。

だから選択肢は本当に(例えば、42及び314の不良ビット位置のため)である:

BytePos BadBitFlag or:  BytePos BadBitPosition 
0..41 0      0/1  42 
42  1      2/3  314 
43..313 0      4/5  -1 
314  1      : 
315..319 0      638/9 -1 

本当に記憶の限界に依存します。

最初の解でcharベースの「ビット」を選択しているので、XORの結果を40のビット配列から展開する必要があるため、どの方法を選択してもデータを計算する必要がありますバイトを320バイトのバイト配列に変換します。

不良ビットのリストをたくさん処理して余分な記憶領域を確保できる場合は、2番目の解決方法を選択します。

リストを数回しか処理しない場合、またはメモリが本当にタイトな場合は、最初の解決策に進みます。

+0

ビットがセットされた場所に '1'を格納するchar配列か、実際の位置を格納するint配列ですか? – saad

+0

@saad、余裕があれば、各 "ビット"を 'char'変数に格納する方が簡単になります。そうでない場合は、ビットを格納し、マスキングとビットシフトを使用してビットを取得する必要があります。 – paxdiablo

+0

おそらく私は何か誤解していますが、マスクやビットシフトは必要ありません。私がint配列を持っていて、最初の '1'が私のビット配列で20である場合、私はint配列の0番目の要素に20を格納します。これはビットの位置の配列になります。ループはn回だけループするため、ビット・アレイに設定されたビットの総数をnとすると、全体的なメモリ消費量は2倍になりますが、処理時間は短縮されます。現在のシステムには、すでに40%が消費されている8K SRAMがあります。ボードの次のスピンで追加のSRAM(最大64K)を追加します。 – saad

2

スペースがこのようなプレミアにある場合、アレイ全体を一度にインデックスに変換するのはなぜですか?私は、40バイトのxor配列を保持し、オフセットを参照する必要があるときには(ビットシフトアルゴリズムを使用して)ループします。

+0

テストベクトルは任意の位置に関連するフォールトを保持できるためです。位置5のフォルトは、位置25のフォルトに関連する可能性があります。あなたのアプローチは有効ですが、このようにすればより完全な情報をオペレータに提供する可能性があります。 – saad

+1

情報を処理する必要がある場合は、おそらく何らかの形で整理する必要があります。ビットを直接ループして整理します。私の指摘は、40x32ビットの配列には、1280整数のゼロまたは1の配列とまったく同じ情報が含まれているということです。 – alexis