Oprettelse af en opslagstabel i en mikrocontroller ved hjælp af i C

Hvordan kan jeg oprette en opslagstabel i en mikrocontroller ved hjælp af C? Jeg har en input og en output og vil implementere en opslagstabel i C.

Svar

Jeg giver en generel svar, da spørgsmålet mangler oplysninger:

Antag at du har en uint8_t som input og en uint8_t som output, og du ønsker at oprette en fuld opslagstabel (dvs. hver input har en output). Du har brug for 256 værdier, da input kan have 256 forskellige værdier. Du kan nu oprette en tabel med:

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

Nøgleordet const skal gemme tabellen i flashhukommelsen , ikke i RAM. Dette skyldes, at RAM er knappe i mikrokontrollere, som jippie påpeger i kommentarerne.

I de krøllede parenteser skal værdierne gå. Du kan nu let slå en inputværdi op med the_table[input_value].


Generelt kan vi sige, at en opslagstabel ser ud som følger:

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

Et lille eksempel på en opslagstabel til at udføre denne konvertering (fra Grå kode , takket være 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 hjælp af uint8_t eller en byte som outputtype:

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

Du kan slå en værdi op med:

some_var = gray_code[input]; 

Kommentarer

  • Jeg kan godt lide denne forklaring er klar og enkel :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } Don ' t har brug for en tabel til det.
  • På en ARM-processor, der kun tager 1 urcyklus! EOR Rn,Rn,Rn,LSR 1, ingen opslagstabeller kan slå det.
  • Mens det ' s normalt ønskeligt at undgå at kopiere konstante initialiserere fra flash til begrænset ram ved opstart (således korrekt brug af " const " og pragmas eller linker konfiguration), er der en undtagelse: mange af disse processorer er sammenlignelige langsomme ved at hente data fra flash " program " hukommelse, så hvis der er RAM tilgængeligt til det, en tabel i RAM, der kun initialiseres en gang fra flashen ved opstart, kan være hurtigere.
  • @PrabinKumar I ' undskyld, men dine svar støder på som send-me-teh-codez . Måske hvis du demonstrerede en indsats for at arbejde med de angivne retningslinjer og kom tilbage med specifikke problemer, du ikke kunne løse, ville du få den hjælp, du rent faktisk har brug for.

Svar

Her er et eksempel på, hvordan jeg ville oprette en opslagstabel for nogle forudberegnede værdier. Jeg vil bruge et eksempel på at bytte bits frem og tilbage inden for en byte. Dette er undertiden nyttigt for FFT-algoritmer eller SPI-perifere enheder, der ønsker den forkerte rækkefølge.

Først opretter jeg et program, der opretter tabellen. Vedligeholdelse af bordet i hånden er trængsel og fejlbehæftet, så dette job skal gives til computeren.

#!/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 kalder denne fil “bitend.py”. Bemærk, at jeg brugte et script-sprog i stedet for et C-program til dette. Generering af tabellen er grundlæggende et strengbehandlingsproblem, og C er en smerte at udføre strengbehandling i. Da tabellen kun er nødvendig på kompileringstidspunktet, kan jeg bruge en hulemands-simpel algoritme, der er mere åbenlyst korrekt t end en optimeret.

Nu for at integrere dette i bygningen. I min Makefile satte jeg et afsnit 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 afhængighed af python-scriptet, så hvis jeg redigerer scriptet, filen regenereres automatisk.

I min vigtigste C-kode inkluderer jeg bare den genererede fil:

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

Nu i min Makefile, Jeg er nødt til at medtage den genererede fil som en afhængighed af C-koden:

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

Og den sidste ting er at tilføje “generated_swapbits.c” til Makefile ” s “rene” mål, så filen fjernes, når “gør rent”.

Hvis du bruger en IDE i stedet for make, skal du konsultere dens dokumentation om kørsel af scripts for at tilfredsstille afhængigheder. (Hvis IDE understøtter ikke dette, vælg en anden IDE.)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *