Cを使用してマイクロコントローラーでルックアップテーブルを作成する

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]; 

コメント

  • 気に入ったこの説明は明確で単純です:)。
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }そのためのテーブルは必要ありません'。
  • 1クロックサイクルしかかからないARMプロセッサの場合! EOR Rn,Rn,Rn,LSR 1、ルックアップテーブルがそれを打ち負かすことはできません。
  • 'は通常起動時にフラッシュから制限付きRAMに定数イニシャライザーがコピーされないようにすることが望ましい(したがって、" const "とプラグマまたはリンカーを適切に使用する構成)、例外があります。これらのプロセッサの多くは、フラッシュ"プログラム"メモリからのデータのフェッチが比較的遅いため、 RAMを使用できる場合は、起動時にフラッシュから1回だけ初期化されたRAM内のテーブルの方が高速になる可能性があります。
  • @PrabinKumar send-me-teh-codez として出くわします。おそらく、提供されたガイドラインを使用して作業する努力を示し、解決できない特定の問題が戻ってきた場合は、実際に必要な支援を受けることができます。

回答

これは、いくつかの事前計算された値のルックアップテーブルを作成する方法の例です。バイト内でビットを前後に交換する例を使用します。これは間違った順序が必要な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を選択してください。)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です