Crear una tabla de búsqueda en un microcontrolador usando en C

¿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

  • Me gusta esta explicación es clara y simple :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } No ' no necesita una tabla para eso.
  • ¡En un procesador ARM que toma solo 1 ciclo de reloj! EOR Rn,Rn,Rn,LSR 1, no hay forma de que una tabla de búsqueda pueda superar eso.
  • Si bien ' s generalmente deseable evitar que se copien inicializadores constantes de flash a ram limitada en el inicio (por lo tanto, uso adecuado de " const " y pragmas o enlazador configuración), hay una excepción: muchos de estos procesadores son comparativamente lentos para obtener datos de la memoria flash " programa ", por lo que si hay Si hay RAM disponible para ello, una tabla en RAM inicializada solo una vez desde la memoria flash al inicio puede ser más rápida.
  • @PrabinKumar I ' lo siento, pero sus respuestas aparecer como send-me-teh-codez . Quizás si demostrara esfuerzo al trabajar con las pautas provistas y regresara con algún problema específico que no pudo resolver, obtendría la ayuda que realmente necesita.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *