logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR-ASM + AVR-GCC] Kodowanie Hamminga (SECDED?). Pełny kod.

Mess-gd 05 Wrz 2008 21:52 2297 0
REKLAMA
  • #1 5509596
    Mess-gd
    Poziom 14  
    Witam. Ostatnio siedziałem nad kodem hamminga (7,4)(SECDED?), który można zaimplementować do mikrokontrolerów AVR. Kod próbowałem optymalizować pod względem szybkości wykonywania. Pliki nie posiadają niestety komentarzy gdyż nie miałem na ich wprowadzenie.

    Mile widziane sugestie dotyczące optymalizacji oraz informacje o błędach w kodzie. Nie pobieram żadnych punktów za kod, ale mile widziane "pomógł".

    Pliki:
    hamming.h - plik nagłówkowy.

    hamming.c - zawiera kod napisany w C. Zdefiniowane są w nim tablica i 2 macierze. Tablica zawiera wygenerowane zakodowane wartości od 0 do 15 (w jednym bajcie przesyłamy 4 bity). Druga macierz to macierz kontroli parzystości H, dzięki której możliwe jest poprawienie jednego błędu. Ostatnia i nie używana (bo wszystkie słowa kodowe są już zapisane w macierzy pierwszej) to macierz generująca. Dzięki niej możemy wygenerować zakodowane 7 bitowe słowo kodowe z 4 bitowych słów informacyjnych.
    W pliku tym znajduje się również nieużywana funkcja generująca słowo kodowe z 4 bitowego słowa informacyjnego.

    hamming.asm.s - plik źródłowy z kodem napisanym w assemblerze. Znajdują się w nim 3 funkcje:
    - checkParity() - funkcja która sprawdza czy podany bajt ma parzystą liczbę 1 (około 18 cyli wraz z wywołaniem funkcji),
    - hammingCorrectError() - zwracająca słowo kodowe z ew. poprawionym jednym błędem binarnym (ok. 60 cykli),
    - hammingDecodeAndMergeBytes() - zwraca słowo informacyjne (1 bajt) z podanych dwóch słów kodowych (ok. 22 cykle zegarowe).

    Krótki algorytm wykorzystania:
    1. kodujemy 1 bajt informacyjny za pośrednictwem 2 zakodowanych bajtów (w tym celu dzielimy bajt na pół i dla każdej z połówek korzystamy z tablicy hammingEncodedBytes - wartość połówki wskazuje indeks w tablicy),
    2. przesyłamy zakodowane bajty przez kanał informacyjny,
    3. odbieramy zakodowane bajty i sprawdzamy poprawność przesyłanej informacji. Spodobów może być kilka, ale wg mnie najlepszy jest taki:
    - sprawdzamy parzystość bitów zakodowanego bajtu (funkcja checkParity()),
    - sprawdzamy parzystość bitów zakodowanego bajtu (funkcja hammingCorrectError()),
    - sprawdzamy parzystość bitów zakodowanego bajtu (funkcja checkParity()),
    - bajt uznajemy za poprawny jezeli wniki sprawdzania parzystości są równe (fałsz, prawda) lub (prawda, prawda).
    4. kolejne 2 odebrane zakodowane bajty poddajemy dekodowaniu za pośrednictwem funkcji hammingDecodeAndMergeBytes() i uzyskujemy słowo informacyjne.

    Słowo kodowe:
    Zakodowany bajt przedstawia się następująco:
    7 - dodatkowy bit parzystości
    6 - bit parzystości kodu Hamminga (1)
    5 - bit parzystości kodu Hamminga (2)
    4 - bit informacyjny (3)
    3 - bit parzystości kodu Hamminga (4)
    2 - bit informacyjny (2)
    1 - bit informacyjny (1)
    0 - bit informacyjny (0)
  • REKLAMA
REKLAMA