Tworzenie tabeli przeglądowej w mikrokontrolerze przy użyciu języka C

Jak mogę utworzyć tabelę przeglądową w mikrokontrolerze za pomocą języka C? Mam jedno wejście i jedno wyjście i chcę zaimplementować tabelę przeglądową w C.

Odpowiedź

Podam ogólną odpowiedź, ponieważ pytanie nie zawiera informacji:

Załóżmy, że masz uint8_t jako dane wejściowe i uint8_t jako wyjście, a ty chcesz utworzyć pełną tablicę przeglądową (tzn. każde wejście ma wyjście). Potrzebujesz 256 wartości, ponieważ wejście może mieć 256 różnych wartości. Możesz teraz utworzyć tabelę z:

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

Słowo kluczowe const służy do przechowywania tabeli w pamięci flash , nie w pamięci RAM. Dzieje się tak, ponieważ w mikrokontrolerach brakuje pamięci RAM, jak wskazuje jippie w komentarzach.

W nawiasach klamrowych wartości powinny się znaleźć. Możesz teraz łatwo wyszukać wartość wejściową za pomocą the_table[input_value].


Ogólnie można powiedzieć, że tabela przeglądowa wyglądałaby następująco:

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

Mały przykład tabeli przeglądowej do wykonania tej konwersji (z szarego kodu , dzięki Anindo Ghosh ):

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

Można zaimplementować w następujący sposób, używając uint8_t lub bajtu jako typu danych wyjściowych:

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

Możesz wyszukać wartość za pomocą:

some_var = gray_code[input]; 

Komentarze

  • Lubię to wyjaśnienie jest jasne i proste :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } Nie ' nie potrzebuję do tego tabeli.
  • Na procesorze ARM, który zajmuje tylko 1 cykl zegara! EOR Rn,Rn,Rn,LSR 1, tabela przeglądowa nie może tego przebić.
  • Chociaż ' s zwykle pożądane jest unikanie kopiowania stałych inicjatorów z pamięci flash do ograniczonej pamięci RAM podczas uruchamiania (w ten sposób właściwe użycie " const " i pragm lub linkera konfiguracji), istnieje wyjątek: wiele z tych procesorów stosunkowo wolno pobiera dane z pamięci flash " programu ", więc jeśli jest czy jest dostępna pamięć RAM, tabela w pamięci RAM zainicjowana tylko raz z pamięci flash podczas uruchamiania może być szybsza.
  • @PrabinKumar I ' m przepraszam, ale Twoje odpowiedzi występować jako send-me-teh-codez . Być może gdybyś wykazał się wysiłkiem w pracy z dostarczonymi wskazówkami i wrócił z jakimikolwiek konkretnymi problemami, których nie byłeś w stanie rozwiązać, uzyskałbyś pomoc, której faktycznie potrzebujesz.

Odpowiedź

Oto przykład, w jaki sposób utworzę tabelę przeglądową dla niektórych wstępnie obliczonych wartości. Posłużę się przykładem zamiany bitów z przodu na tył w obrębie bajtu. To jest czasami przydatne w przypadku algorytmów FFT lub urządzeń peryferyjnych SPI, które wymagają złej kolejności.

Najpierw tworzę program, który tworzy tabelę. Ręczne utrzymywanie tabeli jest męczące i podatne na błędy, więc to zadanie powinno zostać przydzielone do komputera.

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

Nazywam ten plik „bitend.py”. Zauważ, że użyłem do tego języka skryptowego zamiast programu w C. Generowanie tabeli jest zasadniczo problemem związanym z przetwarzaniem ciągów, a przetwarzanie w C jest trudne. Ponieważ tabela jest potrzebna tylko w czasie kompilacji, mogę użyć prostego algorytmu jaskiniowca, który jest bardziej oczywisty poprawny t niż zoptymalizowany.

Teraz, aby zintegrować to z kompilacją. W moim Makefile umieściłem sekcję taką jak ta:

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

Tutaj zrobiłem zależność od skryptu Pythona, więc jeśli edytuję skrypt, C plik zostanie wygenerowany automatycznie.

W moim głównym kodzie C po prostu dołączam wygenerowany plik:

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

Teraz w moim Makefile, Muszę załączyć wygenerowany plik jako zależność kodu C:

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

I ostatnią rzeczą jest dodanie „generated_swapbits.c” do Makefile ” s „czysty” cel, więc plik zostanie usunięty po „make clean”.

Jeśli używasz IDE zamiast make, będziesz musiał zapoznać się z jego dokumentacją o uruchamianiu skryptów w celu spełnienia zależności. IDE tego nie obsługuje, wybierz inne IDE.)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *