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

3

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

    
pregunta Prabin Kumar

2 respuestas

13

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];
    
respondido por el Keelan
4

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

    
respondido por el markrages

Lea otras preguntas en las etiquetas

Comentarios Recientes

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