Hvordan kan jeg lage en oppslagstabell i en mikrokontroller ved hjelp av C? Jeg har en inngang og en utgang og vil implementere en oppslagstabell i C.
Svar
Jeg gir en generell svar siden spørsmålet mangler informasjon:
Anta at du har en uint8_t
som input og en uint8_t
som output og du ønsker å lage en full oppslagstabell (dvs. at hver inngang har utgang). Du trenger 256 verdier, siden inngangen kan ha 256 forskjellige verdier. Du kan nå lage en tabell med:
const uint8_t the_table[256] = { ... }
Nøkkelordet const
er å lagre tabellen i flashminnet , ikke i RAM. Dette er fordi RAM er lite i mikrokontrollere, som jippie påpeker i kommentarene.
I krøllete parenteser bør verdiene gå. Du kan nå enkelt slå opp en inngangsverdi med the_table[input_value]
.
Generelt sett kan vi si at en oppslagstabell ser slik ut:
const OutputType the_table[CountOfInputValues] = { ... };
Et lite eksempel for en oppslagstabell for å gjøre denne konverteringen (fra Grå kode , takk til Anindo Ghosh ):
input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100
Kan implementeres som følger ved å bruke uint8_t
, eller en byte, som utgangstype:
const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100};
Du kan slå opp en verdi med:
some_var = gray_code[input];
Kommentarer
Svar
Her er et eksempel på hvordan jeg ville lage en oppslagstabell for noen forhåndsberegnede verdier. Jeg vil bruke et eksempel på å bytte biter foran og bak i en byte. Dette er noen ganger nyttig for FFT-algoritmer eller SPI-periferiutstyr som vil ha feil rekkefølge.
Først oppretter jeg et program som lager tabellen. Vedlikehold av tabellen for hånd er sløvhet og feilutsatt, så denne jobben bør gis til datamaskinen.
#!/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 "}"
Jeg kaller denne filen «bitend.py». Legg merke til at jeg brukte et skriptspråk i stedet for et C-program for dette. Å generere tabellen er i bunn og grunn et strengbehandlingsproblem, og C er en smerte å gjøre strengbehandling i. Fordi tabellen bare er nødvendig ved kompileringstid, kan jeg bruke en hulemanns-enkel algoritme som er tydeligere korrigert t enn en optimalisert.
Nå for å integrere dette i bygningen. I min Makefile la jeg en seksjon som dette:
generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c
Her gjorde jeg en avhengighet av python-skriptet, slik at hvis jeg redigerer skriptet, vil C filen vil bli regenerert automatisk.
I hoved-C-koden min inkluderer jeg bare den genererte filen:
#include <stdio.h> #include "generated_swapbits.c" int main(void) { printf("Swapped 0x0f is %0x\n", swapbits[0x0f]); }
Nå i min Makefile, Jeg må ta med den genererte filen som en avhengighet av C-koden:
a.out: main.c generated_swapbits.c $(CC) $(CFLAGS) main.c
Og det siste er å legge til «generated_swapbits.c» til Makefile » s «rene» mål, så filen vil bli fjernet når «gjør rent».
Hvis du bruker en IDE i stedet for å lage, må du konsultere dokumentasjonen for å kjøre skript for å tilfredsstille avhengigheter. (Hvis IDE støtter ikke dette, velg en annen IDE.)
uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }
Don ' t trenger en tabell for det.EOR Rn,Rn,Rn,LSR 1
, ingen oppslagstabeller kan slå det.