Opprette en oppslagstabell i en mikrokontroller ved hjelp av i C

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

  • Jeg liker denne forklaringen klar og enkel :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } Don ' t trenger en tabell for det.
  • På en ARM-prosessor som bare tar 1 klokkesyklus! EOR Rn,Rn,Rn,LSR 1, ingen oppslagstabeller kan slå det.
  • Mens det ' er vanligvis jeg er ønskelig for å unngå å ha kopierte konstante initialiserere fra flash til begrenset ram ved oppstart (dermed riktig bruk av " const " og pragmas eller linker konfigurasjon), er det et unntak: mange av disse prosessorene er sammenlignbare sakte når de henter data fra flash " program " minne, så hvis det er RAM tilgjengelig for det, kan en tabell i RAM kun initialiseres en gang fra blitsen ved oppstart, raskere.
  • @PrabinKumar I ' Beklager, men svarene dine komme over som send-me-teh-codez . Kanskje hvis du demonstrerte innsats for å arbeide med retningslinjene som ble gitt, og kom tilbake med spesifikke problemer du ikke kunne løse, ville du få den hjelpen du faktisk trenger.

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.)

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *