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
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.)
uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }
Nie ' nie potrzebuję do tego tabeli.EOR Rn,Rn,Rn,LSR 1
, tabela przeglądowa nie może tego przebić.