Kuinka voin luoda hakutaulukon mikrokontrollerista käyttämällä C: tä? Minulla on yksi tulo ja yksi lähtö ja haluan toteuttaa hakutaulukon C: ssä.
Vastaus
Annan yleisen vastaus, koska kysymyksestä puuttuu tietoja:
Oletetaan, että syötteenä on uint8_t
ja tuotoksena uint8_t
ja sinä haluat luoda täydellisen hakutaulukon (ts. jokaisella syötteellä on lähtö) .Se tarvitsee 256 arvoa, koska syötteellä voi olla 256 erilaista arvoa. Voit nyt luoda taulukon seuraavilla tavoilla:
const uint8_t the_table[256] = { ... }
Hakusanalla const
on taulukko tallennettuna flash-muistiin. , ei RAM-muistissa. Tämä johtuu siitä, että mikrokontrollereissa RAM-muistia on niukasti, kuten jippie huomauttaa kommenteissa.
Kiharoissa sulkeissa arvojen pitäisi mennä. Voit nyt helposti etsiä syöttöarvoa the_table[input_value]
-toiminnolla.
Yleensä voimme sanoa, että hakutaulukko näyttää seuraavalta:
const OutputType the_table[CountOfInputValues] = { ... };
Pieni esimerkki hakutaulukolle tämän muunnoksen tekemiseksi ( harmaasta koodista , Anindo Ghoshin ansiosta ):
input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100
Voidaan toteuttaa seuraavasti, käyttämällä uint8_t
tai tavua ulostulotyypinä:
const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100};
Voit hakea arvoa seuraavilla tavoilla:
some_var = gray_code[input];
kommentit
Vastaa
Tässä on esimerkki siitä, miten luon hakutaulukon joillekin ennalta lasketuille arvoille. Käytän esimerkkiä bittien vaihtamisesta edestä taakse tavussa. on joskus hyödyllinen FFT-algoritmeille tai SPI-oheislaitteille, jotka haluavat väärän järjestyksen.
Ensin luon ohjelman, joka luo taulukon. Taulukon ylläpitäminen käsin on vaivalloista ja virhealtista, joten tämä työ tulisi antaa tietokoneelle.
#!/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 "}"
Kutsun tätä tiedostoa ”bitend.py”. Huomaa, että käytin tähän komentosarjakieltä C-ohjelman sijaan. Taulukon luominen on pohjimmiltaan merkkijononkäsittelyongelma ja C on kipu tehdä merkkijonojen käsittely. Koska taulukkoa tarvitaan vain kokoamisajankohtana, voin käyttää yksinkertaista luolamiehen algoritmia, joka on selvemmin korjattava t kuin optimoitu.
Integroi nyt tämä koontiversioon. Makefileen laitoin seuraavanlaisen osan:
generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c
Täällä riippuin python-komentosarjasta, joten jos muokkaan komentosarjaa, C tiedosto luodaan automaattisesti.
C-pääkoodiini sisällytän vain luodun tiedoston:
#include <stdio.h> #include "generated_swapbits.c" int main(void) { printf("Swapped 0x0f is %0x\n", swapbits[0x0f]); }
Nyt Makefile-tiedostossa, Minun täytyy sisällyttää luotu tiedosto C-koodin riippuvuussuhteeksi:
a.out: main.c generated_swapbits.c $(CC) $(CFLAGS) main.c
Ja viimeinen asia on lisätä ”generated_swapbits.c” Makefileen. s ”puhdas” kohde, joten tiedosto poistetaan, kun ”puhdista”.
Jos käytät IDE: tä merkin sijasta, sinun on tutkittava sen dokumentaatio komentosarjojen suorittamisesta riippuvuuksien tyydyttämiseksi. (Jos IDE ei tue tätä, valitse toinen IDE.)
uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }
Älä ' t tarvitse siihen taulukkoa.EOR Rn,Rn,Rn,LSR 1
, hakutaulukko ei voi mitenkään voittaa sitä.