¿Cómo puedo crear una tabla de búsqueda en un microcontrolador utilizando C? Tengo una entrada y una salida y quiero implementar una tabla de búsqueda en C.
¿Cómo puedo crear una tabla de búsqueda en un microcontrolador utilizando C? Tengo una entrada y una salida y quiero implementar una tabla de búsqueda en C.
Daré una respuesta general ya que la pregunta carece de información:
Supongamos 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ías 256 valores, ya que la entrada puede tener 256 valores diferentes. Ahora puedes 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 los corchetes, los valores deben 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 gris , gracias a Anindo Ghosh ):
input -> output
0b000 0b000
0b001 0b001
0b010 0b011
0b011 0b010
0b100 0b110
0b101 0b111
0b110 0b101
0b111 0b100
Se podría implementar de la siguiente manera, utilizando uint8_t
, o un byte, como el tipo de salida:
const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100};
Puedes buscar un valor con:
some_var = gray_code[input];
Este es un ejemplo de cómo crearía una tabla de búsqueda para algunos valores precalculados. Usaré un ejemplo de intercambio de bits de principio a fin dentro de un byte. Esto a veces es útil para los algoritmos FFT o los periféricos SPI que desean un orden incorrecto.
Primero creo un programa que crea la tabla. Mantener la mesa a mano es un trabajo pesado y propenso a errores, por lo que este trabajo debe asignarse 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 "}"
Yo llamo a este archivo "bitend.py". Note que usé un lenguaje de scripting en lugar de un programa en C para esto. La generación de la tabla es fundamentalmente un problema de procesamiento de cadenas, y C es un problema para hacer el procesamiento de cadenas. Debido a que la tabla solo se necesita en tiempo de compilación, puedo usar un algoritmo simple que es obviamente más correcto que uno optimizado .
Ahora para integrar esto en la compilación. En mi Makefile, pongo 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 archivo C 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 "generic_swapbits.c" al objetivo "limpio" de Makefile, por lo que el archivo se eliminará al "limpiar".
Si usa un IDE en lugar de una marca, 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).
Lea otras preguntas en las etiquetas microcontroller pic c
# .Tópico: Desbordamiento de pila: Definición de clave, ¿no puede agregar tres dígitos de letras altas? ChineseHwaKaien Una enorme cantidad de aplicaciones geniales con tecnología Arduino comenzaron a funcionar en línea. ¡Sería sorprendente si una de esas comenzara a ser accesible para los desarrolladores web internacionales! Un ejemplo de este tipo de proyecto es OOfactory, un IDE que puede escribir una aplicación de código abierto y, por lo tanto, a partir de ahora lo que los programadores quieran escribir... Lees verder