¿Cómo puedo crear una tabla de búsqueda en un microcontrolador usando C? Tengo una entrada y una salida y quiero implementar una tabla de búsqueda en C.
Respuesta
Daré una respuesta ya que la pregunta carece de información:
Suponga que tiene un uint8_t
como entrada y un uint8_t
como salida y desea crear una tabla de búsqueda completa (es decir, cada entrada tiene una salida). Necesitaría 256 valores, ya que la entrada puede tener 256 valores diferentes. Ahora puede crear una tabla con:
const uint8_t the_table[256] = { ... }
La palabra clave const
es almacenar la tabla en la memoria flash. , no en la RAM. Esto se debe a que la RAM es escasa en los microcontroladores, como señala jippie en los comentarios.
En las llaves, los valores deberían ir. Ahora puede buscar fácilmente un valor de entrada con the_table[input_value]
.
En general, podríamos decir que una tabla de búsqueda se vería de la siguiente manera:
const OutputType the_table[CountOfInputValues] = { ... };
Un pequeño ejemplo de una tabla de búsqueda para realizar esta conversión (del código Gray , gracias a Anindo Ghosh ):
input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100
Puede implementarse de la siguiente manera, usando uint8_t
, o un byte, como tipo de salida:
const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100};
Puede buscar un valor con:
some_var = gray_code[input];
Comentarios
Respuesta
Aquí hay un ejemplo de cómo crearía una tabla de búsqueda para algunos valores precalculados. Usaré un ejemplo de intercambio de bits de adelante hacia atrás dentro de un byte. Esto a veces es útil para algoritmos FFT o periféricos SPI que quieren el orden incorrecto.
Primero creo un programa que crea la tabla. El mantenimiento de la tabla a mano es pesado y propenso a errores, por lo que este trabajo debe realizarse a la computadora.
#!/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 "}"
A este archivo lo llamo «bitend.py». Observe que utilicé un lenguaje de secuencias de comandos en lugar de un programa en C para esto. Generando la tabla es fundamentalmente un problema de procesamiento de cadenas, y C es un problema para procesarlas. Debido a que la tabla solo es necesaria en tiempo de compilación, puedo usar un algoritmo simple de hombre de las cavernas que es más obviamente correcto t que uno optimizado.
Ahora integre esto en la compilación. En mi Makefile, puse una sección como esta:
generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c
Aquí hice una dependencia en el script de Python, de modo que si edito el script, el C el archivo se regenerará automáticamente.
En mi código C principal, solo incluyo el archivo generado:
#include <stdio.h> #include "generated_swapbits.c" int main(void) { printf("Swapped 0x0f is %0x\n", swapbits[0x0f]); }
Ahora en mi Makefile, Tengo que incluir el archivo generado como una dependencia del código C:
a.out: main.c generated_swapbits.c $(CC) $(CFLAGS) main.c
Y lo último es agregar «generate_swapbits.c» al Makefile » s «clean» target, por lo que el archivo se eliminará al «make clean».
Si usa un IDE en lugar de make, deberá consultar su documentación sobre la ejecución de scripts para satisfacer las dependencias. (Si el IDE no admite esto, elija un IDE diferente.)
uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }
No ' no necesita una tabla para eso.EOR Rn,Rn,Rn,LSR 1
, no hay forma de que una tabla de búsqueda pueda superar eso.