Criando uma tabela de pesquisa em um microcontrolador usando em C

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

  • Eu gosto esta explicação é clara e simples :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } Não ' não precisa de uma tabela para isso.
  • Em um processador ARM que leva apenas 1 ciclo de clock! EOR Rn,Rn,Rn,LSR 1, nenhuma tabela de pesquisa pode superar isso.
  • Embora ' seja geralmente desejável para evitar ter inicializadores constantes copiados do flash para memória RAM limitada na inicialização (portanto, o uso adequado de " const " e pragmas ou linker configuração), há uma exceção: muitos desses processadores são comparativamente lentos na busca de dados da memória flash " program ", portanto, se houver se houver RAM disponível para ele, uma tabela em RAM inicializada apenas uma vez a partir do flash na inicialização pode ser mais rápida.
  • @PrabinKumar I ' Sinto muito, mas suas respostas aparecer como send-me-teh-codez . Talvez se você demonstrasse esforço em trabalhar com as diretrizes fornecidas e retornasse com problemas específicos que não conseguiu resolver, receberia a ajuda de que realmente precisa.

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *