Erstellen einer Nachschlagetabelle in einem Mikrocontroller mit C

Wie kann ich mit C eine Nachschlagetabelle in einem Mikrocontroller erstellen? Ich habe eine Eingabe und eine Ausgabe und möchte eine Nachschlagetabelle in C implementieren.

Antwort

Ich gebe eine allgemeine Antwort, da die Frage keine Informationen enthält:

Angenommen, Sie haben eine uint8_t als Eingabe und eine uint8_t als Ausgabe und Sie Sie möchten eine vollständige Nachschlagetabelle erstellen (dh jede Eingabe hat eine Ausgabe). Sie benötigen 256 Werte, da die Eingabe 256 verschiedene Werte haben kann. Sie können jetzt eine Tabelle erstellen mit:

const uint8_t the_table[256] = { ... } 

Das Schlüsselwort const dient zum Speichern der Tabelle im Flash-Speicher , nicht im RAM. Dies liegt daran, dass RAM in Mikrocontrollern knapp ist, wie Jippie in den Kommentaren hervorhebt.

In den geschweiften Klammern sollten die Werte stehen bleiben. Sie können jetzt einfach einen Eingabewert mit the_table[input_value] nachschlagen.


Im Allgemeinen könnte man sagen, dass eine Nachschlagetabelle wie folgt aussehen würde:

const OutputType the_table[CountOfInputValues] = { ... };

Ein kleines Beispiel für eine Nachschlagetabelle für diese Konvertierung (aus dem Gray-Code . dank Anindo Ghosh ):

 input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100  

Kann wie folgt implementiert werden, indem uint8_t oder ein Byte als Ausgabetyp verwendet wird:

const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100}; 

Sie können einen Wert suchen mit:

some_var = gray_code[input]; 

Kommentare

  • Ich mag Diese Erklärung ist klar und einfach :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } ' benötigt dafür keine Tabelle.
  • Auf einem ARM-Prozessor, der nur 1 Taktzyklus benötigt! EOR Rn,Rn,Rn,LSR 1, eine Nachschlagetabelle kann das auf keinen Fall übertreffen.
  • Während ' s normalerweise Es ist wünschenswert, zu vermeiden, dass beim Start konstante Initialisierer von Flash auf einen begrenzten RAM kopiert werden (daher " const " und Pragmas oder Linker) Konfiguration) gibt es eine Ausnahme: Viele dieser Prozessoren rufen vergleichsweise langsam Daten aus dem Flash-Programm " " ab Ist RAM dafür verfügbar, kann eine Tabelle im RAM, die beim Start nur einmal vom Flash initialisiert wurde, schneller sein.
  • @PrabinKumar Ich ' tut mir leid, aber Ihre Antworten kommen als send-me-teh-codez rüber. Wenn Sie sich bei der Arbeit mit den bereitgestellten Richtlinien bemüht haben und auf bestimmte Probleme zurückkommen, die Sie nicht lösen konnten, erhalten Sie möglicherweise die Hilfe, die Sie tatsächlich benötigen.

Antwort

Hier ist ein Beispiel dafür, wie ich eine Nachschlagetabelle für einige vorberechnete Werte erstellen würde. Ich werde ein Beispiel für das Vertauschen von Bits von vorne nach hinten innerhalb eines Bytes verwenden ist manchmal nützlich für FFT-Algorithmen oder SPI-Peripheriegeräte, die die falsche Reihenfolge wünschen.

Zuerst erstelle ich ein Programm, das die Tabelle erstellt. Die manuelle Pflege der Tabelle ist mühsam und fehleranfällig, daher sollte dieser Auftrag vergeben werden an den Computer.

#!/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 "}" 

Ich nenne diese Datei „bitend.py“. Beachten Sie, dass ich dafür eine Skriptsprache anstelle eines C-Programms verwendet habe. Generieren der Tabelle ist im Grunde ein String-Verarbeitungsproblem, und C ist ein Problem bei der String-Verarbeitung. Da die Tabelle nur zur Kompilierungszeit benötigt wird, kann ich einen Caveman-einfachen Algorithmus verwenden, der offensichtlicher korrigiert wird t als eine optimierte.

Nun, um dies in den Build zu integrieren. In mein Makefile habe ich einen Abschnitt wie den folgenden eingefügt:

generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c 

Hier habe ich eine Abhängigkeit vom Python-Skript hergestellt, sodass beim Bearbeiten des Skripts das C. Die Datei wird automatisch neu generiert.

In meinen Haupt-C-Code füge ich nur die generierte Datei ein:

#include <stdio.h> #include "generated_swapbits.c" int main(void) { printf("Swapped 0x0f is %0x\n", swapbits[0x0f]); } 

Jetzt in meinem Makefile, Ich muss die generierte Datei als Abhängigkeit des C-Codes einfügen:

a.out: main.c generated_swapbits.c $(CC) $(CFLAGS) main.c 

Und als letztes muss „generate_swapbits.c“ zum Makefile hinzugefügt werden. “ s „sauberes“ Ziel, daher wird die Datei bei „sauber machen“ entfernt.

Wenn Sie eine IDE anstelle von make verwenden, müssen Sie deren Dokumentation zum Ausführen von Skripten konsultieren, um Abhängigkeiten zu erfüllen. (If Die IDE unterstützt dies nicht. Wählen Sie eine andere IDE.)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.