Come posso creare una tabella di ricerca in un microcontrollore utilizzando C? Ho un input e un output e voglio implementare una tabella di ricerca in C.
Answer
Darò una descrizione generale risposta poiché la domanda è priva di informazioni:
Supponi di avere un uint8_t
come input e un uint8_t
come output e si desidera creare una tabella di ricerca completa (ovvero ogni input ha un output). Sono necessari 256 valori, poiché linput può avere 256 valori diversi. Ora puoi creare una tabella con:
const uint8_t the_table[256] = { ... }
La parola chiave const
serve per memorizzare la tabella nella memoria flash , non nella RAM. Questo perché la RAM è scarsa nei microcontrollori, come sottolinea jippie nei commenti.
Tra parentesi graffe, i valori dovrebbero andare. Ora puoi facilmente cercare un valore di input con the_table[input_value]
.
In generale, potremmo dire che una tabella di ricerca avrebbe il seguente aspetto:
const OutputType the_table[CountOfInputValues] = { ... };
Un piccolo esempio di una tabella di ricerca per eseguire questa conversione (dal codice Gray , grazie ad Anindo Ghosh ):
input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100
Potrebbe essere implementato come segue, utilizzando uint8_t
o un byte, come tipo di output:
const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100};
Puoi cercare un valore con:
some_var = gray_code[input];
Commenti
Risposta
Ecco un esempio di come creerei una tabella di ricerca per alcuni valori precalcolati. Userò un esempio di scambio di bit dallinizio alla fine allinterno di un byte. Questo a volte è utile per algoritmi FFT o periferiche SPI che vogliono lordine sbagliato.
Per prima cosa creo un programma che crea la tabella. Mantenere la tabella a mano è faticoso e soggetto a errori, quindi questo lavoro dovrebbe essere assegnato al computer.
#!/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 "}"
Io chiamo questo file “bitend.py”. Notate che ho usato un linguaggio di scripting invece di un programma C. Generazione della tabella è fondamentalmente un problema di elaborazione delle stringhe e C è un problema per lelaborazione delle stringhe. Poiché la tabella è necessaria solo in fase di compilazione, posso usare un algoritmo semplice da uomo delle caverne che è più ovviamente corretto t di uno ottimizzato.
Ora per integrarlo nella build. Nel mio Makefile, ho inserito una sezione come questa:
generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c
Qui ho fatto una dipendenza dallo script python, in modo che se modifico lo script, il C file verrà rigenerato automaticamente.
Nel mio codice C principale, includo solo il file generato:
#include <stdio.h> #include "generated_swapbits.c" int main(void) { printf("Swapped 0x0f is %0x\n", swapbits[0x0f]); }
Ora nel mio Makefile, Devo includere il file generato come dipendenza del codice C:
a.out: main.c generated_swapbits.c $(CC) $(CFLAGS) main.c
E lultima cosa è aggiungere “generated_swapbits.c” al Makefile ” s target “clean”, quindi il file verrà rimosso dopo “make clean”.
Se usi un IDE invece di make, dovrai consultare la sua documentazione sullesecuzione di script per soddisfare le dipendenze. (Se lIDE non lo supporta, scegli un IDE diverso.)
uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }
Non ' non serve una tabella per questo.EOR Rn,Rn,Rn,LSR 1
, in nessun modo una tabella di ricerca può batterlo.