Hakutaulukon luominen mikro-ohjaimelle käyttämällä koodia C

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

  • tykkään tämä selitys on selkeä ja yksinkertainen :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } Älä ' t tarvitse siihen taulukkoa.
  • ARM-prosessorilla, joka kestää vain yhden kellojakson! EOR Rn,Rn,Rn,LSR 1, hakutaulukko ei voi mitenkään voittaa sitä.
  • Vaikka se ' s yleensä toivottavaa välttää jatkuvien alustusohjelmien kopioimista flashista rajoitettuun RAM-muistiin käynnistyksen yhteydessä (täten " const " ja käytäntöjen tai linkkerin asianmukainen käyttö kokoonpano), on olemassa poikkeus: monet näistä prosessoreista ovat verrattain hitaita tietojen hakemisessa flash " -ohjelman " muistista, joten jos on Onko RAM-muistia käytettävissä, RAM-taulukko, joka alustetaan vain kerran salamasta käynnistyksen yhteydessä, voi olla nopeampi.
  • @PrabinKumar I ' Olen pahoillani, mutta vastauksesi törmää nimellä send-me-teh-codez . Ehkä jos osoittaisit vaivaa työskennellessäsi annettujen ohjeiden kanssa ja palataksesi takaisin ongelmiin, joita et pystyisi ratkaisemaan, saat todella tarvitsemasi avun.

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *