Como posso criar uma tabela de pesquisa em um microcontrolador usando C? Eu tenho uma entrada e uma saída e desejo implementar uma tabela de pesquisa em C.
Resposta
Vou dar uma visão geral resposta já que a pergunta não tem informações:
Suponha que você tenha um uint8_t
como entrada e um uint8_t
como saída e você deseja criar uma tabela de pesquisa completa (ou seja, cada entrada tem uma saída). Você “d precisa de 256 valores, pois a entrada pode ter 256 valores diferentes Agora você pode criar uma tabela com:
const uint8_t the_table[256] = { ... }
A const
palavra-chave é armazenar a tabela na memória flash , não na RAM. Isso ocorre porque a RAM é escassa em microcontroladores, como jippie aponta nos comentários.
Nas chaves, os valores devem ir. Agora você pode pesquisar facilmente um valor de entrada com the_table[input_value]
.
Geralmente, poderíamos dizer que uma tabela de pesquisa seria a seguinte:
const OutputType the_table[CountOfInputValues] = { ... };
Um pequeno exemplo de uma tabela de pesquisa para fazer essa conversão (do código Gray , graças a Anindo Ghosh ):
input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100
Pode ser implementado da seguinte maneira, usando uint8_t
, ou um byte, como o tipo de saída:
const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100};
Você pode pesquisar um valor com:
some_var = gray_code[input];
Comentários
Resposta
Aqui está um exemplo de como eu criaria uma tabela de pesquisa para alguns valores pré-computados. Vou usar um exemplo de troca de bits frente a frente dentro de um byte. às vezes é útil para algoritmos FFT ou periféricos SPI que desejam a ordem errada.
Primeiro, crio um programa que cria a mesa. Manter a mesa manualmente é enfadonho e sujeito a erros, portanto, este trabalho deve ser dado para o computador.
#!/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 "}"
Eu chamo esse arquivo de “bitend.py”. Observe que usei uma linguagem de script em vez de um programa C para isso. Gerando a tabela é fundamentalmente um problema de processamento de strings, e C é difícil de fazer o processamento de strings. Como a tabela só é necessária em tempo de compilação, posso usar um algoritmo simples de homem das cavernas que é mais obviamente correto t do que um otimizado.
Agora, para integrar isso na construção. No meu Makefile, coloquei uma seção como esta:
generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c
Aqui eu fiz uma dependência do script python, para que se eu editar o script, o C o arquivo será regenerado automaticamente.
No meu código C principal, apenas incluo o arquivo gerado:
#include <stdio.h> #include "generated_swapbits.c" int main(void) { printf("Swapped 0x0f is %0x\n", swapbits[0x0f]); }
Agora no meu Makefile, Tenho que incluir o arquivo gerado como uma dependência do código C:
a.out: main.c generated_swapbits.c $(CC) $(CFLAGS) main.c
E a última coisa é adicionar “generated_swapbits.c” ao Makefile ” s destino “clean”, então o arquivo será removido após “make clean”.
Se você usar um IDE em vez de make, precisará consultar sua documentação sobre a execução de scripts para satisfazer as dependências. (Se o IDE não suporta isso, escolha um IDE diferente.)
uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }
Não ' não precisa de uma tabela para isso.EOR Rn,Rn,Rn,LSR 1
, nenhuma tabela de pesquisa pode superar isso.