私は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に接続されていることを知っているすべての情報を表示できます。
注:一部のテストでは、すぐにベクトル。それは確かに事実です。
ビットがセットされた場所に '1'を格納するchar配列か、実際の位置を格納するint配列ですか? – saad
@saad、余裕があれば、各 "ビット"を 'char'変数に格納する方が簡単になります。そうでない場合は、ビットを格納し、マスキングとビットシフトを使用してビットを取得する必要があります。 – paxdiablo
おそらく私は何か誤解していますが、マスクやビットシフトは必要ありません。私がint配列を持っていて、最初の '1'が私のビット配列で20である場合、私はint配列の0番目の要素に20を格納します。これはビットの位置の配列になります。ループはn回だけループするため、ビット・アレイに設定されたビットの総数をnとすると、全体的なメモリ消費量は2倍になりますが、処理時間は短縮されます。現在のシステムには、すでに40%が消費されている8K SRAMがあります。ボードの次のスピンで追加のSRAM(最大64K)を追加します。 – saad