Een opzoektabel maken in een microcontroller met in C

Hoe kan ik een opzoektabel maken in een microcontroller met C? Ik heb één invoer en één uitvoer en wil een opzoektabel implementeren in C.

Antwoord

Ik zal een algemene geven antwoord aangezien de vraag geen informatie heeft:

Stel dat u een uint8_t als invoer hebt en een uint8_t als uitvoer en u u een volledige opzoektabel wilt maken (dwz elke invoer heeft een uitvoer). U “zou 256 waarden nodig hebben, aangezien de invoer 256 verschillende waarden kan hebben. U kunt nu een tabel maken met:

const uint8_t the_table[256] = { ... } 

Het sleutelwoord const is om de tabel op te slaan in het flash-geheugen , niet in het RAM. Dit komt omdat RAM schaars is in microcontrollers, zoals jippie aangeeft in de commentaren.

Tussen accolades moeten de waarden verdwijnen. U kunt nu gemakkelijk een invoerwaarde opzoeken met the_table[input_value].


Over het algemeen zouden we kunnen zeggen dat een opzoektabel er als volgt uitziet:

const OutputType the_table[CountOfInputValues] = { ... };

Een klein voorbeeld van een opzoektabel om deze conversie uit te voeren (van de grijze code , met dank aan Anindo Ghosh ):

 input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100  

Kan als volgt worden geïmplementeerd, met uint8_t, of een byte, als het uitvoertype:

const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100}; 

Je kunt een waarde opzoeken met:

some_var = gray_code[input]; 

Reacties

  • Ik vind deze uitleg duidelijk en eenvoudig :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } Don ' heb daarvoor geen tabel nodig.
  • Op een ARM-processor die slechts 1 klokcyclus nodig heeft! EOR Rn,Rn,Rn,LSR 1, daar kan een opzoektabel niet tegenop.
  • Hoewel het ' meestal wenselijk om te voorkomen dat constante initializers worden gekopieerd van flash naar beperkte ram bij het opstarten (dus correct gebruik van " const " en pragmas of linker configuratie), is er een uitzondering: veel van deze processors zijn relatief traag bij het ophalen van gegevens uit flash " programma " geheugen, dus als er is er RAM voor beschikbaar, een tabel in RAM die slechts eenmaal is geïnitialiseerd vanaf de flash bij het opstarten, kan sneller zijn.
  • @PrabinKumar I ' m sorry, maar uw antwoorden komen over als send-me-teh-codez . Als je moeite hebt gedaan om met de gegeven richtlijnen te werken en terugkomt met specifieke problemen die je niet kon oplossen, zou je misschien de hulp krijgen die je echt nodig hebt.

Antwoord

Hier is een voorbeeld van hoe ik een opzoektabel zou maken voor een aantal vooraf berekende waarden. Ik zal een voorbeeld gebruiken van het van voren naar achteren verwisselen van bits binnen een byte. Dit is soms handig voor FFT-algoritmen of SPI-randapparatuur die de verkeerde volgorde willen.

Eerst maak ik een programma dat de tabel maakt. De tafel met de hand onderhouden is saai en foutgevoelig, dus deze taak moet naar de computer.

#!/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 "}" 

Ik noem dit bestand “bitend.py”. Merk op dat ik hiervoor een scripttaal gebruikte in plaats van een C-programma. De tabel genereren is fundamenteel een string-processing probleem, en C is lastig om string-processing in uit te voeren. Omdat de tabel alleen nodig is tijdens het compileren, kan ik een caveman-simple algoritme gebruiken dat duidelijker correct is t dan een geoptimaliseerde.

Nu om dit in de build te integreren. In mijn Makefile heb ik een sectie als deze geplaatst:

generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c 

Hier heb ik een afhankelijkheid gemaakt van het python-script, zodat als ik het script bewerk, de C bestand wordt automatisch opnieuw gegenereerd.

In mijn C-hoofdcode voeg ik gewoon het gegenereerde bestand toe:

#include <stdio.h> #include "generated_swapbits.c" int main(void) { printf("Swapped 0x0f is %0x\n", swapbits[0x0f]); } 

Nu in mijn Makefile, Ik moet het gegenereerde bestand opnemen als een afhankelijkheid van de C-code:

a.out: main.c generated_swapbits.c $(CC) $(CFLAGS) main.c 

En het laatste is om “generated_swapbits.c” toe te voegen aan de Makefile ” s “clean” -doel, dus het bestand zal worden verwijderd bij “make clean”.

Als u een IDE gebruikt in plaats van make, moet u de bijbehorende documentatie raadplegen over het uitvoeren van scripts om aan de afhankelijkheden te voldoen. (als de IDE ondersteunt dit niet, kies een andere IDE.)

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *