Keresési táblázat létrehozása mikrovezérlőben a C

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük