Cを使用してマイクロコントローラーでルックアップテーブルを作成するにはどうすればよいですか? 1つの入力と1つの出力があり、Cでルックアップテーブルを実装したいと思います。
回答
一般的な説明をします質問に情報が不足しているため、回答します。
入力としてuint8_t
があり、出力としてuint8_t
があるとします。完全なルックアップテーブルを作成したい(つまり、すべての入力に出力がある)。入力には256の異なる値を含めることができるため、256の値が必要です。これで、次のコマンドでテーブルを作成できます。
const uint8_t the_table[256] = { ... }
const
キーワードは、テーブルをフラッシュメモリに保存することです。 、RAMにはありません。これは、jippieがコメントで指摘しているように、マイクロコントローラーではRAMが不足しているためです。
中括弧内の値は、次のようになります。 the_table[input_value]
を使用して入力値を簡単にルックアップできるようになりました。
一般に、ルックアップテーブルは次のようになります。
const OutputType the_table[CountOfInputValues] = { ... };
この変換を行うためのルックアップテーブルの小さな例(グレイコードから)、 Anindo Ghoshに感謝):
input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100
出力タイプとしてuint8_t
またはバイトを使用して、次のように実装できます。
const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100};
次のコマンドで値を検索できます:
some_var = gray_code[input];
コメント
回答
これは、いくつかの事前計算された値のルックアップテーブルを作成する方法の例です。バイト内でビットを前後に交換する例を使用します。これは間違った順序が必要なFFTアルゴリズムやSPI周辺機器に役立つ場合があります。
最初にテーブルを作成するプログラムを作成します。テーブルを手作業で保守するのは面倒でエラーが発生しやすいため、このジョブを実行する必要があります。
#!/usr/bin/python def swapbits(x): ret=0 for i in range(8): if x&(1<<i): ret |= 1<<(7-i) return ret print "const uint8_t bitswap[] = {", print ", ".join("0x%02x"%swapbits(x) for x in range(256)), print "}"
このファイルを「bitend.py」と呼びます。これには、Cプログラムの代わりにスクリプト言語を使用したことに注意してください。テーブルの生成は基本的に文字列処理の問題であり、Cは文字列処理を行うのに苦労します。テーブルはコンパイル時にのみ必要になるため、より明らかに正しいcaveman-simpleアルゴリズムを使用できます。最適化されたものよりも。
これをビルドに統合します。 Makefileに、次のようなセクションを配置します。
generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c
ここで、Pythonスクリプトに依存するようにしたので、スクリプトを編集すると、Cファイルは自動的に再生成されます。
メインのCコードには、生成されたファイルを含めるだけです。
#include <stdio.h> #include "generated_swapbits.c" int main(void) { printf("Swapped 0x0f is %0x\n", swapbits[0x0f]); }
これで、Makefileに、生成されたファイルをCコードの依存関係として含める必要があります:
a.out: main.c generated_swapbits.c $(CC) $(CFLAGS) main.c
最後に、「generate_swapbits.c」をMakefileに追加します。 ■「clean」ターゲット。「makeclean」でファイルが削除されます。
makeの代わりにIDEを使用する場合は、依存関係を満たすためのスクリプトの実行について、そのドキュメントを参照する必要があります。 IDEはこれをサポートしていません。別のIDEを選択してください。)
uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }
そのためのテーブルは必要ありません'。EOR Rn,Rn,Rn,LSR 1
、ルックアップテーブルがそれを打ち負かすことはできません。