használatával Hogyan hozhatok létre keresési táblázatot egy mikrovezérlőben a C használatával? Van egy bemenetem és egy kimenetem, és szeretnék egy keresési táblázatot megvalósítani a C-ben.
Válasz
I “általános válasz, mivel a kérdésből hiányzik az információ:
Tegyük fel, hogy uint8_t
van bemenetként, és uint8_t
kimenetként, és Ön teljes keresőtáblát akar létrehozni (azaz minden bemenetnek van kimenete). 256 értékre van szüksége, mivel a bemenetnek 256 különböző értéke lehet. Most létrehozhat egy táblázatot a következővel:
const uint8_t the_table[256] = { ... }
A const
kulcsszó az, hogy a táblázatot a flash memóriában tárolja. , nem a RAM-ban. Ez azért van, mert a mikrovezérlőkben kevés a RAM, amint azt a jippie megjegyzi.
A göndör zárójelben az értékeknek menniük kell. Most könnyedén megkeresheti a bemeneti értéket a the_table[input_value]
használatával.
Általában azt mondhatjuk, hogy a keresési táblázat a következőképpen néz ki:
const OutputType the_table[CountOfInputValues] = { ... };
Egy kis példa egy keresőtáblára az átalakítás elvégzéséhez (a szürke kódból , Anindo Ghoshnak köszönhetően ):
input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100
Meg lehet valósítani az alábbiak szerint, kimeneti típusként a uint8_t
vagy egy bájt használatával:
const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100};
Értéket kereshet a következőkkel:
some_var = gray_code[input];
Megjegyzések
Válasz
Itt van egy példa arra, hogyan hoznék létre egy keresőtáblát néhány előre kiszámított értékhez. Példát fogok használni a bitek előre-hátra cseréjére egy bájtban. Ez néha hasznos lehet az FFT algoritmusok vagy az SPI perifériák számára, amelyek rossz sorrendet akarnak.
Először létrehozok egy programot, amely létrehozza a táblázatot. A tábla kézzel történő karbantartása nehézkes és hajlamos, ezért ezt a munkát meg kell a számítógépre.
#!/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 "}"
Ezt a fájlt “bitend.py” -nek hívom. Megjegyzés: Ehhez egy C program helyett egy szkriptnyelvet használtam. alapvetően karakterlánc-feldolgozási probléma, és C fájdalom a karakterlánc-feldolgozás elvégzése során. Mivel a táblára csak fordítási időben van szükség, használhatok egy barlanglakó egyszerű algoritmust, amely nyilvánvalóan korrekt t, mint egy optimalizált.
Most integrálja ezt a buildbe. A Makefile-m egy ilyen szakaszt tettem:
generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c
Itt függőséget állítottam fel a python szkripttől, így ha a szkriptet szerkesztem, akkor a C A fájl automatikusan újratermelődik.
A fő C kódomban csak a létrehozott fájlt adom meg:
#include <stdio.h> #include "generated_swapbits.c" int main(void) { printf("Swapped 0x0f is %0x\n", swapbits[0x0f]); }
Most a Makefile-mben, A létrehozott fájlt a C-kód függőségeként kell felvennem:
a.out: main.c generated_swapbits.c $(CC) $(CFLAGS) main.c
És az utolsó dolog az, hogy hozzá kell adni a “generated_swapbits.c” fájlt a Makefile fájlhoz. s “tiszta” cél, így a fájl a “make clean” -kor eltávolításra kerül.
Ha IDE-t használ a make helyett, akkor a függőségek kielégítéséhez olvassa el annak dokumentációját a parancsfájlok futtatásáról. az IDE nem támogatja ezt, válasszon másik IDE-t.)
uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }
Don ' ehhez nincs szükség táblázatra.EOR Rn,Rn,Rn,LSR 1
, a keresőtábla ezt semmiképp sem tudja legyőzni.