Skapa en uppslagstabell i en mikrokontroller med hjälp av i C

Hur kan jag skapa en uppslagstabell i en mikrokontroller med C? Jag har en ingång och en utgång och vill implementera en uppslagstabell i C.

Svar

Jag ger en allmän svara eftersom frågan saknar information:

Antag att du har en uint8_t som ingång och en uint8_t som utgång och du vill skapa en fullständig uppslagstabell (dvs. varje ingång har en utgång). Du behöver 256 värden, eftersom ingången kan ha 256 olika värden. Du kan nu skapa en tabell med:

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

Nyckelordet const är att lagra tabellen i flashminnet , inte i RAM-minnet. Detta beror på att RAM är knappt i mikrokontroller, som jippie påpekar i kommentarerna.

I de lockiga parenteserna bör värdena gå. Du kan nu enkelt slå upp ett ingångsvärde med the_table[input_value].


Generellt sett kan vi säga att en uppslagstabell skulle se ut enligt följande:

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

Ett litet exempel för en uppslagstabell för att göra denna konvertering (från Grå kod , tack vare Anindo Ghosh ):

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

Kan implementeras på följande sätt med uint8_t, eller en byte, som utgångstyp:

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

Du kan slå upp ett värde med:

some_var = gray_code[input]; 

Kommentarer

  • Jag gillar denna förklaring tydlig och enkel :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } Don ' t behöver en tabell för det.
  • På en ARM-processor som bara tar en klockcykel! EOR Rn,Rn,Rn,LSR 1, ingen uppslagstabell kan slå det.
  • Medan den ' är vanligtvis önskvärt för att undvika att konstanta initialiserare kopieras från flash till begränsad ram vid start (alltså korrekt användning av " const " och pragmas eller linker konfiguration), det finns ett undantag: många av dessa processorer är jämförelsevis långsamma när de hämtar data från flash " program " minne, så om det finns är RAM tillgängligt för det, en tabell i RAM som initialiserats endast en gång från blixten vid start kan vara snabbare.
  • @PrabinKumar I ' jag är ledsen, men dina svar stöter på som skicka mig-teh-codez . Kanske om du visade ansträngningar för att arbeta med riktlinjerna och kom tillbaka med några specifika problem som du inte kunde lösa, skulle du få den hjälp du faktiskt behöver.

Svar

Här är ett exempel på hur jag skulle skapa en uppslagstabell för några förberäknade värden. Jag kommer att använda ett exempel på att byta bitar fram och tillbaka i en byte. är ibland användbart för FFT-algoritmer eller SPI-kringutrustning som vill ha fel ordning.

Först skapar jag ett program som skapar tabellen. Att underhålla bordet för hand är slitage och felbenägen, så det här jobbet bör ges till datorn.

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

Jag kallar den här filen ”bitend.py”. Observera att jag använde ett skriptspråk istället för ett C-program för detta. Generera tabellen är i grunden ett strängbearbetningsproblem, och C är en smärta att göra strängbearbetning i. Eftersom tabellen bara behövs vid sammanställningstid kan jag använda en grottman-enkel algoritm som är tydligare t än en optimerad.

Nu för att integrera detta i byggnaden. I min Makefile lägger jag till ett sådant avsnitt:

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

Här gjorde jag ett beroende av python-skriptet, så att om jag redigerar skriptet, filen kommer att regenereras automatiskt.

I min C-huvudkod inkluderar jag bara den genererade filen:

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

Nu i min Makefile, Jag måste inkludera den genererade filen som ett beroende av C-koden:

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

Och det sista är att lägga till ”generated_swapbits.c” till Makefile ” s ”rena” mål, så filen kommer att tas bort när ”gör ren”.

Om du använder en IDE istället för att göra, måste du läsa dess dokumentation om att köra skript för att tillgodose beroenden. (Om IDE stöder inte detta, välj en annan IDE.)

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *