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
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.)
uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }
Don ' t behöver en tabell för det.EOR Rn,Rn,Rn,LSR 1
, ingen uppslagstabell kan slå det.