Vytvoření vyhledávací tabulky v mikrokontroléru pomocí v C

Jak mohu vytvořit vyhledávací tabulku v mikrokontroléru pomocí C? Mám jeden vstup a jeden výstup a chci implementovat vyhledávací tabulku v C.

Odpověď

Uvedu obecný odpověď, protože v otázce chybí informace:

Předpokládejme, že máte uint8_t jako vstup a uint8_t jako výstup a vy chcete vytvořit úplnou vyhledávací tabulku (tj. každý vstup má výstup). Potřebujete 256 hodnot, protože vstup může mít 256 různých hodnot. Nyní můžete vytvořit tabulku pomocí:

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

Klíčové slovo const je uložit tabulku do paměti flash , ne v RAM. Je to proto, že RAM je u mikrokontrolérů vzácná, jak zdůrazňuje v komentářích jippie.

V kudrnatých závorkách by hodnoty měly jít. Nyní můžete snadno vyhledat vstupní hodnotu pomocí the_table[input_value].


Obecně bychom mohli říci, že vyhledávací tabulka bude vypadat takto:

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

Malý příklad vyhledávací tabulky k provedení této konverze (z šedého kódu , díky Anindovi Ghoshovi ):

 input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100  

Mohlo by být implementováno následovně pomocí uint8_t nebo bajtu jako typu výstupu:

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

Hodnotu můžete vyhledat pomocí:

some_var = gray_code[input]; 

komentářů

  • líbí se mi toto vysvětlení jasné a jednoduché :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } Nepotřebujete k tomu tabulku.
  • Na procesoru ARM, který trvá pouze 1 takt! EOR Rn,Rn,Rn,LSR 1, vyhledávací tabulka to nijak nepřekoná.
  • Zatímco ' s obvykle je žádoucí vyhnout se tomu, aby se při spuštění kopírovaly konstantní inicializátory z flash do omezeného ram (tedy správné použití " const " a pragmas nebo linkeru konfigurace), existuje výjimka: mnoho z těchto procesorů je při načítání dat z paměti flash " " srovnatelně pomalé, takže pokud existuje je RAM k dispozici, tabulka v RAM inicializovaná pouze jednou z flash při spuštění může být rychlejší.
  • @PrabinKumar I ' omlouvám se, ale vaše odpovědi narazit jako send-me-teh-codez . Možná kdybyste prokázali úsilí při práci s poskytnutými pokyny a vrátili se s konkrétními problémy, které jste nedokázali vyřešit, získáte pomoc, kterou skutečně potřebujete.

Odpověď

Zde je příklad toho, jak bych vytvořil vyhledávací tabulku pro některé předpočítané hodnoty. Použiji příklad prohození bitů front-to-back v bajtu. je někdy užitečné pro algoritmy FFT nebo periferní zařízení SPI, které požadují nesprávné pořadí.

Nejprve vytvořím program, který vytvoří tabulku. Ruční údržba tabulky je drudgery a náchylná k chybám, takže tato práce by měla být zadána do počítače.

#!/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 "}" 

Tomuto souboru říkám „bitend.py“. Všimněte si, že jsem k tomu místo programu C použil skriptovací jazyk. Generování tabulky je v zásadě problém se zpracováním řetězců a C je bolest při zpracování řetězce. Protože je tabulka potřebná pouze v době kompilace, mohu použít algoritmus jednoduchý barbar, který je zjevně korektnější než optimalizovaný.

Nyní to integrovat do sestavení. Ve svém Makefile jsem vložil sekci jako je tato:

generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c 

Zde jsem vytvořil závislost na skriptu pythonu, takže pokud upravím skript, C soubor se automaticky obnoví.

Ve svém hlavním C kódu vložím pouze vygenerovaný soubor:

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

Nyní v mém Makefile, Vygenerovaný soubor musím zahrnout jako závislost kódu C:

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

A poslední věcí je přidat do souboru Makefile soubor „generated_swapbits.c“ s „clean“ cíl, takže soubor bude odstraněn při „make clean“.

Pokud použijete IDE místo make, budete si muset v jeho dokumentaci ověřit běh skriptů, abyste uspokojili závislosti. (Pokud IDE to nepodporuje, vyberte jiné IDE.)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *