Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 3 kwi 2025, o 18:16


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
    Autor Wiadomość
    PostNapisane: 16 lip 2013, o 19:22 
    Offline
    Użytkownik

    Dołączył(a): 27 lis 2012
    Posty: 291
    Pomógł: 6

    Uwaga
    Lepsza wersja!

    http://jaktodziala.eu/
    Obrazek
    Rozdz. 8 Ostateczna wersja rejestru CRC

    Pod rejestrem CRC są "fotografie" 9 stanów rejestru CRC i Dzielna + 3 zera dla dzielnej 100011. Jest to powtórzony rys. 14.2 z części 1 artykułu.
    Zrób schemat rejestru CRC w/g poniższego przepisu "na małpę", a układ na pewno obliczy resztę z wprowadzonej dzielnej ( oczywiście z 3 dodatkowymi zerami) przez dzielnik 1011. Słowo harcerza.
    1 - Napisz dzielnik
    2 - Wstaw między bity dzielnika przerzutniki typu D (D2, D1, D0)
    3 - Dokończ schemat, tak jak na rys. 15
    Obrazek
    Rys. 15 Rejestr CRC
    Analogicznie możesz zbudować CRC dla dowolnego dzielnika. np 1011011000010101. Ważne tylko, żeby dzielnik zaczynał i kończył się jedynką.
    Pierwsze pytanie. A gdzie ROM dzielnika? Odpowiedź- Jest ujęty w sprzężeniu zwrotnym zawierającym (lub nie) xor-y. Super. Z układu znika ROM.
    Gdy "małpa" wystarczy - przejdź do rozdziału 9.
    Gdy nie - dokończ rozdz. 8.
    Najpierw o samym D
    Obrazek
    Rys.15.1 Przerzutnik typu D
    Narastające zbocze zegara (czerwone) zapamiętuje wejście x gdzieś wewnątrz przerzutnika. Opadające zbocze zegara (zielone) odtwarza ten stan na wyjściu D przerzutnika. Czyli wyjście przerzutnika odtwarza stan wejścia z opóźnieniem impulsu zegarowego. Opóźnienie umożliwia realizację takich układów, jak np. rys. 15, w których na wejście mogą wchodzić sygnały zależne (tu pośrednio) od wyjścia. Możliwy jest nawet pojedynczy przerzutnik typu D, którego wyjście (ale w stanie następnym), zależy od tego wyjścia D (ale w stanie aktualnym) i od wejścia x przerzutnika (też w stanie aktualnym). Przykład tego znajdziesz dalej na rys. 23.
    Analiza układu na rys. 15, gdy dzielną + 3 zera jest 100011000.
    Gdy wyjście D2=0 to D1 i D0 oraz D0 i komunikat będą miały bezpośrednie połączenie. Takie same jak D2 i D1. Dlatego że 0 XOR x = x. Patrz rozdz. 5 cz. 1. Czyli w następnym okresie CRC będzie zachowywał się jak zwykły rejestr przesuwny.
    W stanie 0 D2=0. Czyli następny stan 1 to przesunięte bity D1, D0 i najstarszy bit komunikatu 1, czyli 001
    W stanie 1 D2=0. Czyli następny stan 2 to przesunięte bity D1, D0 i najstarszy bit komunikatu 1, czyli 010
    W stanie 2 D2=0. Czyli następny stan 3 to przesunięte bity D1, D0 i najstarszy bit komunikatu 1, czyli 100
    W stanie 3 D2=1. Czyli następny stan 4 to....??? No właśnie jaki będzie ten stan 4?
    Teraz:
    na wejście D2 wchodzi D0 (bezpośrednie połączenie)
    na wejście D1 wchodzi 1 XOR D0 czyli Negacja D0
    na wejście D0 wchodzi 1 XOR komunikat czyli Negacja komunikat
    Dokończmy więc przerwane wyżej zdanie.
    W stanie 3 D2=1. Czyli następny stan 4 to 011
    Wyjaśnienie dla stanu 4
    D2=0 bo w poprzednim stanie3 D1=0 a między D2 i D1 jest zwykłe połączenie
    D1=1 bo w poprzednim stanie3 D0=0 a na D1 wchodzi Negacja (D0=0), czyli 1
    D0= 1 bo w poprzednim stanie3 komunikat=0 a na D0 wchodzi Negacja (komunikat=0), czyli 1
    Jedziemy dalej:
    W stanie 4 D2=0. Czyli następny stan 5 to przesunięte bity D1, D0 i najstarszy bit komunikatu 1, czyli 111
    ....
    W ten sposób dojdziemy do stanu końcowego
    CRC = 111
    Czyli 111 jest resztą z dzielenia 100011 przez 1011
    Może to było mętne. W każdym bądź razie starałem się przekonać,że układ z rys. 15 oblicza resztę z dzielenia.

    Rozdz. 9 Nadajnik-Odbiornik z CRC .
    Wstęp
    Przedstawione niżej rys. 17...21 zawierają wszystkie stany Nadajnika wysyłającego do Odbiornika komunikat 100011 wykorzystując dzielnik 1011 do wykrywania błędów. Przypomnę tylko, że dzielnik ten jest ujęty w strukturze rejestru CRC-N nadajnika i w CRC-O odbiornika--> rys. 16.Rysunek ten przedstawia schemat dokładny i uproszczony. Dalej będą używane tylko schematy uproszczone CRC (CRC-N dla Nadajnika i CRC-O dla Odbiornika). Gdy na torze między nadajnikiem i odbiornikiem (np w kablu) nie wystąpiły przekłamania, to w każdym stanie wartości rejestrów CRC-N i CRC-O są takie same, co łatwo zauważyć. Stany 0...9 odpowiadają stanom 0...9 z rys. 15. W stanie 9 w rejestrach tych będzie ta sama wartość, reszta z dzielenia 100011:1101 równa 111. Następnie w stanach 10,11,12 wartość z CRC-N wprowadzana jest do CRC-O, w celu ich porównania.
    W stanie 12 wartość CRC-O = 000, co oznacza, że nie wystąpiły błędy transmisji. Puste bity na rysunkach, oznaczają że nic do nich nie zostało jeszcze wpisane, albo że nie mają już żadnego znaczenia. Gdybym wpisał tam np. zera, to trudniej byłoby zauważyć, jak "bity przesuwają się" w każdym stanie.
    Rysunki 17...21 są podobne do rys. 1,2 lub 3,4. z części 1. Drobne różnice wynikają z tego, że na rys. 1,2 lub 3,4 obowiązuje reszta zwykłego dzielenia, a na rys. 17...21 obowiązuje reszta z dzielenia xor-owego.

    Obrazek
    Rys.16 Rejestr CRC schemat dokładny i uproszczony

    Obrazek
    Rys. 17 Nadajnik-Odbiornik stany 0,1,2
    Stan 0 Rejestr Nadajnika RN zawiera komunikat do wysłania +3 zera tj. 110101000. Rejestry RN i RO są zawsze rejestrami przesuwnymi.
    W stanach 0,1,2 rejestry CRC-N i CRC-Ozachowują się bardzo miło. A to dlatego że jedynka nie dotarła jeszcze do najstarszego bitu. Ponieważ w najstarszym bicie jest 0, to zgodnie z algorytmem (rys. 15) w następnym stanie bity w rejestrach będą tylko przesunięte. W stanie 3 jedynka co prawda już dotarła do najstarszego bitu CRC-N i CRC-O. Ale dopiero w następnym stanie 4, zgodnie z algorytmem, po przesunięciu , nastąpi xor-owanie odpowiednich bitów. Dlatego rejestry CRC-N i CRC-O do końca stanu 3, zachowują się jak zwykłe rejestry przesuwne. Stan wszystkich rejestrów zależy też od położeń przełączników K1 i K2. Dotyczy to wszystkich rysunków 17...21.
    stan 1 - jako następny po stanie 0 --> rys. 15
    stan 2 - jako następny po stanie 1 --> rys. 15
    stan 3 - jako następny po stanie 2 --> rys. 15

    Obrazek
    Rys. 18 Nadajnik-Odbiornik stany 3,4,5
    Od tej pory rejestry mogą być tylko przesunięte lub przesunięte i xor-owane . Już nie jest tak miło jak w stanach 0,1,2.
    stan 3 - jako następny po stanie 2 --> rys. 15
    stan 4 - jako następny po stanie 3 --> rys. 15
    stan 5 - jako następny po stanie 4 --> rys. 15

    Obrazek
    Rys. 19 Nadajnik-Odbiornik stany 6,7,8
    stan 6 - jako następny po stanie 5 --> rys. 15
    Cały komunikat 100011 został już przesłany do RO. Nie ma sensu przesyłania 000. Dlatego pod koniec tego stanu zmieni się położenie przełącznika K1. Do końca transmisji zawartość RO nie ulegnie zmianie. Następnie będą modyfikowane tylko CRC-N i CRC-O. Będą też "znikać" zera w RN.
    stan 7 - jako następny po stanie 6 --> rys. 15 (widać zmienione K1)
    stan 8 - jako następny po stanie 7 --> rys. 15

    Obrazek
    Rys. 20 Nadajnik-Odbiornik stany 9,10,11
    stan 9.. - jako następny po stanie 8 --> rys. 15
    W CRC-N i CRC-O jest już ostatecznie obliczona ta sama reszta z dzielenia 111. Ta sama-tzn. że na kablu Nadajnik-Odbiornik nie było zakłóceń. W następnych stanach 10,11,12 Odbiornik będzie sprawdzał, czy rzeczywiście są takie same. Dane z CRC-N w Nadajniku będą więc wprowadzane do CRC-O w Odbiorniku i porównywane bit po bicie.Pod koniec stanu 9 zmieni się położenie K2. W następnych stanach 10,11,12 najstarszy bit CRC-N będzie wprowadzany do najmłodszego bitu CRC-O

    stan 10 - jako następny po stanie 9
    Widać zmienione położenie K2. Pojawił się też dodatkowy niebieski bit, do którego będzie wprowadzany najstarszy bit z CRC-O. Jednocześnie do najmłodszego bitu CRC-O będzie wprowadzony najstarszy bit z CRC-N i natychmiast porównany z bitem niebieskim. Czyli będą porównane 2 najstarsze bity z CRC-N i CRC-O ze stanu poprzedniego. Porównanie czyli xor-owanie. Ponieważ były takie same, to w najmłodszym bicie CRC-O będzie 0.

    stan 11 - jako następny po stanie 10.
    Porównane będą 2 następne bity z CRC-N i CRC-O. Wynik (0) wpisany będzie do najmłodszego bitu CRC-O.

    Obrazek
    Rys. 21 Nadajnik-Odbiornik stany 12 - ostatni
    stan 12 - ostatni - jako następny po stanie 11
    Porównane będą 2 następne bity z CRC-N i CRC-O. Wynik (0) wpisany będzie do najmłodszego bitu CRC-O.KONIEC!!!--ZWYCIĘSTWO. Rejestr CRC-O = 000 oznacza, że (z pewnym prawdopodobieństwem!) nie było błędów transmisji. Dlaczego z pewnym prawdopodobieństwem? Mogło tak się zdarzyć, że były zakłócenia na linii, ale przypadkowo "zakłócona" liczba (inna niż nadana!) dała taką samą resztę resztę jak liczba nadana.
    Podsumowanie:
    Każdorazowemu wprowadzeniu bitu z RN do RO towarzyszą aktualizacje rejestrów CRC-N w nadajniku i CRC-O w odbiorniku. Jeżeli na kablu Nadajnik-Odbiornik nie było zakłóceń, to w każdej chwili CRC-N = CRC-O . Gdy cały komunikat znajdzie się w RO to CRC-N = CRC-O = 111. W 3 następnych krokach porównujemy zawartości tych rejestrów. Końcowy stan CRC-O = 000 oznacza, że nie było błędów.

    Można zaproponować pewna modyfikację wyżej opisanej metody
    Wróć na chwilę do rys. 14.3 w rozdz. 8. Gdybyśmy jakimś cudem w stanie 0 znali resztę = 111 i wstawili ją jako 111 , zamiast 000, to w stanie 9 będzie CRC = 000. Można teraz zaproponować 2 wersje zmodyfikowanej metody.
    Metoda nr 1 Prymitywna. Są 2 cykle. W pierwszym cyklu obliczymy resztę 111. Drugi cykl, to powtórzony pierwszy tylko zamiast 000 damy resztę 111. Obliczona w 2 cyklu reszta = 000, oznacza że nie było błędów. Podstawowa wada, to 2 razy wydłużony czas transmisji.
    Metoda nr 2 Zauważmy, że CRC w stanach 0...6 na rys. 14.2 i 14.3 nie różnią się. Jest to oczywiste, bo 3 ostatnie bity 000 lub 111 jeszcze nie dotarły do CRC. Zapamiętajmy więc stan CRC w stanie 6 w jakimś rejestrze pomocniczym. Potem w 3 krokach dojdziemy do staniu 9, w którym mamy obliczoną resztę CRC=111. Teraz wprowadźmy z rejestru pomocniczego do CRC ten zapamiętany stan 6 (CRC=100). Czyli sztucznie wróciliśmy do stanu 6. Zaś do rejestru Dzielna + 3 zera wprowadzimy resztę 111 (którą już znamy!). Dojdziemy do stanu końcowego CRC = 000. Oznacza ,że transmisja była bezbłędna! I zrobiliśmy to tylko w jednym cyklu. Co prawda, wydłużonym o 3 dodatkowe kroki. Nie będę analizował elektroniki dla zmodyfikowanej metody a ściślej dla metody nr 2 .Chyba jest trochę bardziej skomplikowana niż na rys. 17...21
    Obrazek
    Rys. 22 Metoda zmodyfikowana

    Rozdz. 10 Takie sobie rozważania o dzielnej, dzielniku i rejestrze CRC
    Często słyszymy coś takiego. Komunikat ma 10 000 bitów. Wystąpiły przekłamania tylko na 2 pozycjach bitowych tego komunikatu. Dany algorytm ze 100% pewnością wykrywa te przekłamania. Tu powinna się zapalić czerwona lampka. Przecież nie ma rzeczy w 100 % pewnych. Nie mam przecież 100% pewności, że jutro nie zapuka do mnie Jej Wysokość Królowa Elżbieta II i powie "hello". Prawdopodobieństwo że takie zdarzenie zajdzie (tzn. jutro ta pani nie zapuka) to jest 99,99999999999...%. Ale nie 100%. Dlatego zdanie o tych 2 przekłamaniach powinno brzmieć. Dany algorytm ze 100% pewnością wykrywa te przekłamania powstałe na torze sygnałowym między Nadajnikiem i Odbiornikiem. Czyli milcząco zakładamy, że elektronika nadajnika i odbiornika realizuje ze 100% pewnością dany algorytm. Elektronika jak żona Cezara, jest poza wszelkimi podejrzeniami.
    Poważni ludzie zamiast słowa dzielna używają komunikat lub wiadomość lub message. Tak samo zamiast dzielnik mówią wielomian generujący lub generator. Nie znalazłem innych nazw dla rejestru CRC, w którym będzie wynik reszta z dzielenia. Tu liczę na pomoc czytelników. Dzielnik może być przedstawiony, tak jak dotychczas, tzn. jako liczba binarna np. Dzielnik = 1011. Symbol 1011 to skrócony zapis 1x2^3 + 1x2^1 + 1x2^0, gdzie 3 to nr najstarszego bitu, a 0 to nr najmłodszego. Nie powinienem tego pisać na szacownym forum, ale tak tylko sobie powiem, że 2^0 = 1. Jest też inna forma przedstawiania dzielnika. Zamiast Dzielnik = 1011, można napisać Wielomian generujący = x^3 + x^1 + 1. Zauważ, że dla x=2 wartość tego wielomianu odpowiada dokładnie 1011=9.
    Porozmawiajmy teraz o samym dzielniku ( inaczej, wielomianie generującym lub generatorze). Jak go dobierać, jaka powinna być jego długość ...itp. Powinien zaczynać i kończyć się na 1. Czyli może to być np. 11, 101 lub 100001. Odpada za to 001 lub 00110100. Dlaczego? Chyba dlatego, że zera z lewej i prawej strony nie zawierają informacji ważnej dla obliczania reszty z dzielenia.
    Zaczniemy od najprostszego dzielnika=11 lub inaczej wielomian generujący = x^1 + x^0 = x +1. Odpowiada mu 1-bitowy rejestr CRC.
    Obrazek
    Rys. 23 CRC dla dzielnika 11
    Rejestr CRC został zrealizowany zgodnie z rys. 15. Nowy stan przerzutnika D0 jest xor-em z wejścia i poprzedniego stanu D0. Gdy na wejściu jest 0 to stan się nie zmieni (jak było 0 to będzie 0, jak 1 to też 1). Gdy na wejściu jest 1, to stan zmieni się na przeciwny. W technice cyfrowej toto nazywa się dwójka licząca lub przerzutnik typu T. Analizę pozostawiam Czytelnikowi. To jest klasyczny układ z bitem parzystości! Rzeczywiście, zakładając że stanem początkowym jest D0=0, to jeżeli nie było przekłamań to bit ten pozostanie też 0. Gdy nie ma błędów, to (jednobitowe!) rejestry CRC-N i CRC-0, są zawsze takie same. Niestety, tu nie mamy pewności, że błędy nie wystąpiły. Po każdej parzystej liczbie błędów rejestry CRC-N i CRC-O też będą takie same. Czasami jednak korzystamy z takich układów. Np. gdy komunikaty są krótkie, lub wiemy z doświadczenia że układ jest pewny i rzadko występują przekłamania. Jeżeli już, to bardzo rzadko pojedyncze przekłamanie, a podwójne to "prawie nigdy".
    Obrazek
    Rys. 24 Przerywnik żartobliwy trochę - Inna realizacji dzielnika 11
    Żeby było jasne. Na górze widzisz paluszki projektanta. Tak wyglądał przerzutnik lampowy komputera z 1958 r. Taki mały, a przechowuje cały jeden bit. Z wikipedii.

    Dlaczego CRC mimo wszystko przepuszcza błędy? Odpowiedź jest prosta. Przecież CRC oblicza resztę z dzielenia komunikatu przez wielomian generacyjny. Do znudzenia wałkowaliśmy przykład obliczania reszty z dzielenia liczby 100011 przez 1011. Pamiętamy że reszta to 111. Jest to co prawda reszta z dzielenia xor-owego, ale jest pełna analogia do dzielenia zwykłego. Np 327 : 13 = 25 reszta 2. Zauważ, że taką samą resztę otrzymamy gdy wykonamy 314 : 13 = 24 reszta 2, lub 301 :13 = 23 reszta 2 itd. Gdyby więc na kablu Nadajnik - Odbiornik jakiś złośliwy chochlik podmienił wysyłane z Nadajnika 327 na 314 lub 301 , to w CRC-N nadajnika i w CRC-O odbiornika byłyby takie same reszty 2. A ponieważ w CRC-O występuje odjęcie tych wartości (patrz stany 10...12 w rozdz. 10), to nadajnik na podstawie CRC-O = 000, wyciągnie fałszywy wniosek, że nie było błędów.
    Jaki powinien być dzielnik, żeby przepuszczał najmniej błędów?
    Odpowiedź jest trudna. Z tego robi się doktoraty lub prace habilitacyjne. Tu pytanie do znawców tematu. Czy w ogóle ma ono sens? Jaki wielomian generujący o danej ilości bajtów-1,2,3 lub 4, zapewnia najmniejszą liczbę błędów transmisj?. Byłem prawie pewien, że dla współczesnej matematyki to sprawa zamknięta. Jak twierdzenie Pitagorasa. Z internetu odniosłem jednak wrażenie, że temat stale się rozwija. Trafiłem na dyskusję z 2006 r gdzie bardzo poważni panowie, kłócili się czy ten wielomian jest lepszy czy inny. Z niecierpliwością czekam na jakiś komentarz, np biegłego magistranta. To teraz jako maluczki powiem to co wiem o dzielniku, albo się domyślam.
    1- Powinien zaczynać i kończyć się jedynką - była o tym mowa wczęśniej
    2- Im większy dzielnik tym mniej przepuszcza błędów. Wcześniej stwierdziliśmy, że dla np 327 : 13 resztą jest2. Ta sama reszta 2 będzie też dla dzielnej 314, 301 i innych. Wystarczy więc zwiększyć ...dzielnik np na 47, żeby dzielnych, które dają tę samą resztę (tu dla 327 : 47 = 6 reszta 45), było mniej.
    ...Wniosek - Większy dzielnik-->mniej błędów. W przypadku dzielenia xor-owego jest jeszcze prościej. Więcej bitów ma dzielnik-->mniej błędów. To jest chyba pewne.
    3 - Chociaż komunikat wysyłany jest bit po bicie, to wiadomo że bity te zorganizowane w bajty. Dlatego dzielnik też będzie miał strukturę bajtową + 1 bit najstarszy. Dzięki temu nasz rejestr CRC będzie miał pełne bajty. W praktyce 1,2 3 lub 4.
    4- To teraz pytanie na deser. Jaki dzielnik "4-bajtowy + 1 bit" (inaczej wielomian generujący lub generator) przepuszcza najmniej dzielnych (komunikatów) które dają tę samą resztę. Inaczej - przepuszcza najmniej błędów. Odpowiedź jest banalnie prosta. Jest to liczba 1.0000.0100.1010.0001.0001.1101.1011.0111. Dlaczego? Chyba każdy to widzi. Oczywiście to żart!. Ale zastanawiam się jak ludzie do tego doszli? Przecież tu jest chyba ponad 4 miliardy kombinacji. Czy poprzez twierdzenia algebry wyższej? A może symulacje. Sprawdzamy wszystkie możliwe 33 bitowe kombinacje, przy wszystkich kombinacjach komunikatów o długości np. 1024 bajty. Może wystarczą krótsze np. 128 bajtów? I wybierzemy taką, która daje najmniej reszt. Może to jest właśnie ta w/w liczba? Może ktoś rozwinie ten temat? Tak przy okazji. Używasz tego dzielnika codziennie jako wielomian używany w standarcie ETHERNET tzw CRC-32.
    Postać wielomianowa dzielnika CRC-32 = x^32 + x^26 +x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +x^7 ++ x^5+ x^4 + x^2 + x + 1. Aby zbudować rejestr CRC dla tego wielomianu wystarczy oczywiście skorzystać z rys. 15. Tu już nie żartuję.
    Podam jeszcze 2 często używane wielomiany generujące
    Wielomian używany przez protokoł HDLC CRC-16 = x^16 + x^15 + x^2 + 1
    Standart CCITT CRC-CCITT = x^16 + x^12 + x^5 + 1

    Nie jestem tego pewien, ale CRC na rys. 23 to realizacja wielomianu CRC-2 = x+1 . Mądrych ludzi proszę o potwierdzenie. Jeżeli takowego nie ma, to zdanie to traktuj z przymrużeniem oka!

    NAJWAŻNIEJSZE - JAKA JEST SKUTECZNOŚĆ WYKRYWANIA BŁĘDÓW!!!!
    Znalazłem coś takiego dla CRC-16
    Metodą CRC-16 można wykryć :
    - wszystkie pojedyncze błędy transmisji (błędy tylko w jednym bicie) - komentarz - Nic wielkiego,to robi głupi przerzutnik na rys. 23!
    - wszystkie podwójne błędy - komentarz - Nie rzuca na kolana, ale może być
    - wszystkie błędy w nieparzystej ilości bitów
    - wszystkie błędy w bloku do 16 bitów
    - 99,9984% pozostałych błędów transmisji. I to jest samo miodzio - bardzo ważna informacja. Nie wiem czy mam rację, ale podejrzewam że 0,0016% błędów wiąże się "z tymi samymi resztami" omówionymi wcześniej.

    Nie znalazłem danych dotyczących CRC-32. Podejrzewam, że jako metoda używająca 2 razy większego dzielnika będzie dużo lepsza od CRC-16.

    Jeszcze taki mały paradoks. Zauważ że CRC-16 wykrywa w 100% błędy transmisji, które "tylko trochę" zniekształcają informację wyjściową np. w 1 bicie lub kilku. Jest to oczywiste. Przypominam że w CRC siedzi reszta z dzielenia komunikatu (liczby którą Nadajnik wysyła do Odbiornika) przez jakiś dzielnik. Nie jest to zwykłe dzielenie, ale xor-owe. Nie mniej jednak efekty tych dzieleń ("zwykłych" i xor-owych) są podobne. Wiadomo że np. reszta z dzielenia np. 578:19 to 8. (578=19x30 + 8). Zauważ jednak że ta sama reszta = 8, będzie też przy wysyłanym komunikacie 559, 540, 521...46, 27 i 8. Czyli gdyby komunikat został "zniekształcony" do w/w liczb to byłaby ta sama reszta 8 i Odbiornik potraktujemy odebrany komunikat jako bezbłędny. To gdzie ten paradoks? No właśnie. Gdy zniekształcenie jest małe, np Odbiornik odebrał liczbę 576 (zamiast 578, to na 100% błąd ten będzie wykryty, bo na 100% będzie inna reszta. Gdy zniekształcenie jest duże (w krańcowym wypadku zupełnie przypadkowa liczba) to odbiornik wykryje ten błąd, ale z prawdopodobieństwem np. 99,99%, a nie 100%. To 0,01% to wtedy, gdy przypadkowo reszta będzie taka sama, chociaż komunikat będzie zupełnie inny.
    Gdyby te reguła obowiązywał w życiu codziennym, to na 100% odróżnimy strongmana Pudzianowskiego od jego podobnego brata bliźniaka (gdyby miał takowego), ale tylko na 99,99% od jakiegoś przedszkolaka.

    Rozdz. 11 Prawdziwy Nadajnik-Odbiornik z CRC
    Rys. 25 jest uogólnieniem rys.17...21 z rozdz. 10
    Różnice są następujące
    Rys. 17...21 - 1 komórka oznacza 1 bit
    Rys. 25 - 1 komórka oznacza 1 bajt (oprócz komórki "niebieskiej" w stanach 10...12, która jest bitem)

    Rys. 17...21 - RN dla komunikatu 6-bitowego + 3 zera
    Rys. 25 - RN dla komunikatu 1020-bajtowego + 4 bajtowe zera (czyli 8160 bitów + 32 zera)

    Rys. 17...21 - RO dla komunikatu 6-bitowego
    Rys. 25 - RO dla komunikatu 1020-bajtowego + (czyli 8160 bitów)

    Rys. 17...21 CRC-N i CRC-O 3-bitowe realizujące dzielnik = 1011
    Rys. 25 CRC-N i CRC-O 4-bajtowe (32-bitowe) realizujące dzielnik CRC-32 = 1.0000.0100.1010.0001.0001.1101.1011.0111

    Wspólnymi cechami dla rys. 17...21 i 25 są:
    - transmisje między rejestrami są takie same tzn. po jednym bicie!
    - "niebieska" jednobitowa komórka jako przedłużenie rejestru CRC-O
    - gdy na kablu Nadajnik-Odbiornik nie ma zakłóceń, to w każdym stanie w rejestrach CRC-N i CRC-O są takie same wartości!

    Obrazek
    rys. 25 Nadajnik-Odbiornik z 4-bajtowym CRC i z 1020-bajtowym komunikatem
    Rys. 17...21 odnoszą się do sytuacji "dydaktycznej", gdzie komunikat miał tylko 6 bitów. Dlatego bez problemu można było przedstawić "fotografie" wszystkich 12 stanów. Rys. 25 dotyczy komunikatu o długości 8160 bitów nie mówiąc już o 32 zerach. Trudno byłoby przestawić 8192 "fotografii" dla wszystkich stanów. Okazuje się, że można to zrobić na 3 "fotografiach", jak na rys. 25. Każdej fotografii przyporządkowany jest symbol 0...6, 7...9 lub 10...12.
    Stanom 0...6 na rys. 25 odpowiadają te stany na rys. 17...19
    Stanom 7...9 na rys. 25 odpowiadają te stany na rys. 19...20
    Stanom 10...12 na rys. 25 odpowiadają te stany na rys. 20...21

    Opis poszczególnych stanów na rys. 25 Uwaga - komórki to bajty a nie bity (oprócz "niebieskiej", która jest bitem)

    Stany 0...6 - Przesuwanie komunikatu z RN do RO. Aktualizacje CRC-N i CRC-O.
    Stan 0
    RN komórki 0...3 - 4 x zero (czyli 32 zerowe bity)
    RN komórki 4...1019 - komunikat
    CRC-N i CRC-O - wyzerowane
    Stany 1...5
    W tych stanach komórki będą stopniowo wprowadzane z RN do RO, CRC-N i CRC-O. W każdym kroku będą odpowiednio modyfikowane rejestry CRC-N i CRC-O. Rejestr RO będzie się "wydłużał" do lewej strony a rejestr RN będzie się skracał z prawej strony.
    Stan 6
    RN - tylko 4 najstarsze komórki - 4 x zero (czyli 32 zerowe bity), pozostałe nieistotne
    RO - Komunikat zajmuje cały rejestr. Ze względu na stan przełącznika w stanach 7...12,tak będzie już do końca.
    CRC-N i CRC-O - takie same wartości.

    Stany 7...9 - Komunikat w RO ustalony. Tylko aktualizacje CRC-N i CRC-O.
    W stanie 9 w CRC-N i CRC-O są już te same, ostatecznie obliczone wartości reszt.

    Stany 10...12 - Komunikat w RO ustalony. Porównywanie wartości w CRC-N i CRC-O.
    "Niebieski" bit pełni dokładnie taką samą rolę w porównywaniu, jak na rys. 20, 21 w stanach 10...12
    W stanie końcowym
    RN - "pusty" (zera albo nieistotne)
    R0 - komunikat
    CRC-N - "pusty" (zera albo nieistotne)
    CRC-O - gdy nie było błędów --> wyzerowany
    ........- gdy były-->wartość niezerowa
    Gdy Odbiornik na podstawie CRC-O stwierdzi, że były błędy, to może zażądać od Nadajnika ponownego przesłania komunikatu.

    Rozdz. 12 Programowe obliczanie reszty CRC - metoda SIMPLE (1-bitowa)
    Do tej pory reszta była obliczana w CRC metodą bit po bicie. Przy okazji proszę zwrócić uwagę jak prosty jest ten hardware (rys. 15). Nawet gdyby realizowany był wielomian CRC-32. Rysunek miałby wtedy 32 przerzutniki D i inną konfigurację xor-ów. Też byłby to w miarę prosty układ, który jednak potrafi obliczyć resztę z dzielenia np. liczby 1000 bajtowej przez 4 bajtową. I to prawie nie opóźniając transmisji. A co zrobić gdy nasz mikrokontroler nie ma wbudowanego mechanizmu CRC? Jedyne wyjście to metody programowe. Zaczniemy od metody SIMPLE. Jest to bezpośrednia realizacja programowa algorytmu "rejestrowego". Jedynego jakiego znamy do tej pory. Niestety, program bardzo zmniejsza prędkość transmisji, ponieważ realizowany jest metodą "bit po bicie".
    Obrazek
    Rys. 26 Jakie będzie CRC po wprowadzeniu 1 bitu?

    Rys. 26a - bit sterujący 0
    Lewa strona -wersja "rejestrowa" algorytmu
    Dzielnik 1011011. (Najstarszy bit zawsze 1, lecz tylko "czerwone" bity wpływają na algorytm)
    Aktualny stan CRC=011001 widoczny w górnym wierszu prostokąta (1 "czeka" na wejściu)
    Bit sterujący (najstarszy) CRC=0, dlatego bity będą tylko przesunięte w lewo.
    Prawa strona - wersja "xor-owania pisemnego z 2 kreskami"
    Czyli inna wersja algorytmu dająca ten sam wynik.
    Pod dolną kreską 0110011 CRC+"czekająca" jedynka. Nazwijmy to dzielną.
    Bit sterujący CRC=0, dlatego dzielną należy xor-ować z przesuniętymi 000000 o 1 bit w prawo. Wynik widoczny nad górną kreską. Taki sam jak w dolnym wierszu prostokąta.

    Rys. 26b - bit sterujący 1
    Lewa strona -wersja "rejestrowa" algorytmu
    Aktualny stan CRC=111001 widoczny w górnym wierszu prostokąta (1 "czeka" na wejściu)
    Bit sterujący (najstarszy) CRC=1, dlatego bity będą
    - przesunięte w lewo (jak w dolnym wierszu prostokąta z lewej strony) a potem
    - xor-owane z czerwonymi bitami 011011 dzielnika (jak w dolnym wierszu prostokąta "środkowego")
    Prawa strona - wersja "xor-owania pisemnego z 2 kreskami"
    Pod dolną kreską 0110011 CRC+"czekająca" jedynka. Nazwijmy to dzielną.
    Bit sterujący CRC=1, dlatego dzielną należy xor-ować z przesuniętymi czerwonymi bitami 011011 dzielnika. Wynik widoczny nad górną kreską. Taki sam jak w dolnym wierszu prostokąta środkowego.
    Uwaga Nazwa "sterujący" najstarszego bitu CRC jest chyba oczywista. Gdy 0 to tylko przesunięcie. Gdy 1 to przesunięcie + xor-owanie z "czerwonymi" bitami dzielnika.

    Rys. 26c - wersja "tablicowa" algoryrmu
    Jest odpowiednikiem "xor-owania pisemnego z 2 kreskami"
    Lewa strona
    W czarnym prostokącie jest aktualny stan CRC=111001. Z prawej strony "czekająca" jedynka
    Pod rejestrem tablica z wierszami o adresach 0 i 1
    - wiersz o adresie 0 zawiera 000000
    - wiersz o adresie 1 zawiera 011011 (czerwone jedynki dzielnika)
    Środek strony
    Bity w czarnym prostokącie + lewa jedynka są przesunięte w lewo. Tu sterujący bit 1 (najstarszy) CRC został "wypchnięty" w lewo. Ponieważ bit sterujący = 1, to rejestr CRC będzie xor-owany z wierszem o adresie też 1. Wynik tego xor-owania będzie widoczny na prawej stronie.
    Prawa strona
    Ostateczny wynik operacji. CRC = 001000
    Uwaga. Gdyby na początku (lewa strona) było CRC=011001 , to bitem sterującym będzie 0. Wtedy po przesunięciu CRC będzie xor-owane z zawartością wiersza o adresie 0. Czyli wynikiem będzie 110011.

    Zarys programu obliczającego resztę CRC
    Niniejszy program będzie obliczał resztę tak jak na rys. 15.
    Tzn. Przesyłaną wiadomością jest 100011
    Dzielnikiem jest 1011
    Program w C-podobnym języku bunga-bunga powinien policzyć resztę z dzielenia 100011:1011

    Wyzeruj rejestr CRC (3 bity)
    Dopisz do wiadomości 3 zera - stan 0 na rys. 15
    WHILE(jeszcze nie jest wprowadzona cała wiadomość z zerami)
    {
    ...PRZESUŃ CRC o jeden bit w lewo i wprowadź najstarszy bit wiadomości z zerami do CRC
    ...IF(wychodzący bit jest 1) (XOR-uj CRC z 011)
    }
    Przetestuj ten program pomagając sobie rys.15, a przekonasz się że na końcu CRC=111

    Rozdz. 13 Programowe obliczanie reszty CRC - metoda tablicowa ĆWIERĆBAJTOWA (2-bitowa)
    Od razu zastrzegam, że metoda ta nie jest (chyba?) stosowana w praktyce. Potraktujmy ją jako wstęp dla metody " prawdziwej" tj tablicowej "BAJTOWEJ".
    Z załączonego na końcu poprzedniego programu wynika, że wysłanie jednego bitu wymaga 2 instrukcji w języku wyższego poziomu niż assembler (np. C). Odpowiadać to może, tu strzelę np. 10 instrukcjom maszynowym. Może trochę upraszczam, ale zakładając że transmisja jednego bitu odpowiada jednej instrukcji maszynowej, to od razu rzuca sie w oczy jak program może opóźniać transmisję! Jak zwiększyć "szybkość" programu? Nie trzeba być Eugeniuszem żeby zaproponować wprowadzanie dwóch bitów (ćwierćbajtu) jednocześnie do rejestru CRC.

    Przy wprowadzaniu do CRC 1 bitu tablica zawiera tylko 2 wiersze (rys. 26c). Pierwszy o adresie 0 gdy bitem sterującym jest 0 i drugi o adresie 1, gdy bitem sterującym jest 1.
    Przy wprowadzaniu do CRC 2 bitów, będą odpowiednio 4 kombinacje bitów sterujących, czyli najstarszych 2 bitów rejestru CRC - 00, 01, 10 i 11. Czyli tablica będzie 4 wierszowa. W zależności od tych bitów, rejestr będzie odpowiednio przesuwał i (ewentualnie) xor-ował swoje bity. Rozpatrzmy więc te 4 kombinacje.

    Pierwsza kombinacja - bity sterujące 00
    Obrazek
    Rys. 27 Jakie będzie CRC po wprowadzeniu "ćwierćbajtu" (2 bitów)? - bity sterujące 00

    Rys. 27a - wersja algorytmu "rejestrowa"
    Dzielnik 1011011. (Najstarszy bit zawsze 1, lecz tylko "czerwone" bity wpływają na algorytm)
    Aktualny stan CRC=001001 widoczny w górnym wierszu prostokąta (01 "czeka" na wejściu). Bit sterujący (najstarszy) CRC=0, dlatego bity będą tylko przesunięte w lewo.Efekt 010010 widać w środkowym wierszu. Tu znowu bit sterujący CRC=0. Bity ponownie będą tylko przesunięte w lewo. Efekt 100101 widać w dolnym wierszu.
    Akurat w powyższym przykładzie 2 pierwsze bity to 00. Dlatego zmiany w CRC to tylko 2 przesunięcia bez xor-owania.

    Rys. 27b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Aktualny stan + 2 bity "czekające" CRC=00100101 pod dolną kreską.
    bity 000000 nad kreską odpowiadają pierwszemu przesunięciu. Następne 000000 drugiemu. Po xor-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy 100101 - to samo co w dolnym wierszu prostokąta z rys. 27a.

    Rys. 27c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Bity 000000 są wynikiem sumowania 2 wierszy 000000 na rys. 27b. Czyli 100101 nad górną kreską jest xor-em z 100101 i 000000. Wynik oczywiście taki sam jak na rys. 27a.

    Rys. 27d Wersja tablicowa algorytmu dla bitów sterujących 00 - stan początkowy
    W czarnym prostokącie jest początkowy stan rejestru CRC=001001 + 2 bity "czekające" 01. Z bitami sterującymi 00 związany jest wiersz o adresie też 00, zawierający 000000

    Rys. 27e Wersja tablicowa algorytmu dla bitów sterujących 00 - stan pośredni
    Bity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr xor-ujemy z wierszem tablicy o adresie 00. czyli z 000000. Wynik tego działania będzie widoczny na rys. 27f

    Rys. 27f Wersja tablicowa algorytmu dla bitów sterujących 00 - stan końcowy
    Taki sam wynik jak na rys. 27a.

    Druga kombinacja - bity sterujące 01
    Obrazek
    Rys. 28 Jakie będzie CRC po wprowadzeniu "ćwierćbajtu" (2 bitów)? - bity sterujące 01

    Rys. 28a - wersja algorytmu "rejestrowa"
    Dzielnik 1011011.
    Aktualny stan CRC=011001 widoczny w górnym wierszu prostokąta (01 "czeka" na wejściu). Bit sterujący (najstarszy) CRC=0, dlatego bity będą tylko przesunięte w lewo.Efekt 110010 widać w środkowym wierszu. Ale teraz bit sterujący CRC=1. Bity ponownie będą przesunięte w lewo a potem xor-owane przez 011011. Efekt 111110 widać w dolnym wierszu.

    Rys. 28b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Aktualny stan + 2 bity "czekające" CRC=01100101 pod dolną kreską. Bity 000000 nad kreską odpowiadają pierwszemu przesunięciu. Następne - przesunięciu i xor-owaniu przez 011011. Po xor-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy 111110 - to samo co w dolnym wierszu prostokąta z rys. 28a.

    Rys. 28c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Bity 011011 są wynikiem xor-owania wierszy 000000 i 011011 na rys. 28b. Czyli 111110 nad górną kreską jest xor-em z 100101 i 011011. Wynik oczywiście taki sam jak na rys. 28a.

    Rys. 28d Wersja tablicowa algorytmu dla bitów sterujących 01 - stan początkowy
    W czarnym prostokącie jest początkowy stan rejestru CRC=011001 + 2 bity "czekające" 01. Z bitami sterującymi 01 związany jest wiersz o adresie też 01, zawierający 011011.

    Rys. 28e Wersja tablicowa algorytmu dla bitów sterujących 01 - stan pośredni
    Bity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr xor-ujemy z wierszem tablicy o adresie 01. Wynik tego działania będzie widoczny na rys. 28f

    Rys. 28f Wersja tablicowa algorytmu dla bitów sterujących 01 - stan końcowy
    Taki sam wynik jak na rys. 28a.

    Trzecia kombinacja - bity sterujące 10
    Obrazek
    Rys. 29 Jakie będzie CRC po wprowadzeniu "ćwierćbajtu" (2 bitów)? - bity sterujące 10

    Rys. 29a - wersja algorytmu "rejestrowa"
    Dzielnik 1011011.
    Aktualny stan CRC=101001 widoczny w górnym wierszu prostokąta (01 "czeka" na wejściu).Bit sterujący CRC=1. Bity będą przesunięte w lewo, a potem xor-owane przez 011011. Efekt 001001 widać w środkowym wierszu. Ale teraz bit sterujący (najstarszy) CRC=0, dlatego bity będą tylko przesunięte w lewo.Efekt 010011 widać w dolnym wierszu.

    Rys. 29b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Aktualny stan + 2 bity "czekające" CRC=01100101 pod dolną kreską. Bity 011011 nad kreską odpowiadają pierwszemu przesunięciu i xor-owaniu przez 011011. Następne 000000 - tylko przesunięciu. Po xor-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy 010011 (to samo co w dolnym wierszu prostokąta z rys. 29a).

    Rys. 29c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Bity 011011 są wynikiem xor-owania wierszy 011011 i 0000000 na rys. 29b. Czyli 010011nad górną kreską jest xor-em z 100101 i 110110. Wynik oczywiście taki sam jak na rys. 29a.

    Rys. 29d Wersja tablicowa algorytmu dla bitów sterujących 10 - stan początkowy
    W czarnym prostokącie jest początkowy stan rejestru CRC=101001 + 2 bity "czekające" 01. Z bitami sterującymi 10 związany jest wiersz o adresie też 10, zawierający 110110.

    Rys. 29e Wersja tablicowa algorytmu dla bitów sterujących 10 - stan pośredni
    Bity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr xor-ujemy z wierszem tablicy o adresie 10. Wynik tego działania będzie widoczny na rys. 29f

    Rys. 29f Wersja tablicowa algorytmu dla bitów sterujących 10 - stan końcowy
    Taki sam wynik jak na rys. 29a.

    Czwarta kombinacja - bity sterujące 11
    Obrazek
    Rys. 30 Jakie będzie CRC po wprowadzeniu "ćwierćbajtu" (2 bitów)? - bity sterujące 11

    Rys. 30a - wersja algorytmu "rejestrowa"
    Dzielnik 1011011.
    Aktualny stan CRC=111001 widoczny w górnym wierszu prostokąta (01 "czeka" na wejściu). Bit sterujący (najstarszy) CRC=1, dlatego bity będą przesunięte w lewo a potem xor-owane przez 011011. Efekt 101001 widać w środkowym wierszu. Teraz bit sterujący znowu CRC=1. Bity ponownie będą przesunięte w lewo a potem xor-owane przez 011011. Efekt 001000 widać w dolnym wierszu.

    Rys. 30b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Aktualny stan + 2 bity "czekające" CRC=11100101 pod dolną kreską. Bity 011011 nad kreską odpowiadają pierwszemu przesunięciu i xor-owaniu przez 011011. Następne - drugiemu przesunięciu i xor-owaniu . Po xor-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy 001000 - to samo co w dolnym wierszu prostokąta z rys. 30a.

    Rys. 30c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Bity 101101 są wynikiem xor-owania 2 wierszy 011011 na rys. 30b. Czyli 001000nad górną kreską jest xor-em z 100101 i 101101. Wynik oczywiście taki sam jak na rys. 30a.

    Rys. 30d Wersja tablicowa algorytmu dla bitów sterujących 11 - stan początkowy
    W czarnym prostokącie jest początkowy stan rejestru CRC=111001 + 2 bity "czekające" 01. Z bitami sterującymi 11 związany jest wiersz o adresie też 11, zawierający 101101.

    Rys. 30e Wersja tablicowa algorytmu dla bitów sterujących 11 - stan pośredni
    Bity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr xor-ujemy z wierszem tablicy o adresie 11. Wynik tego działania będzie widoczny na rys. 30f

    Rys. 30f Wersja tablicowa algorytmu dla bitów sterujących 11 - stan końcowy
    Taki sam wynik jak na rys. 30a.

    Metoda tablicowa ćwierćbajtowa
    Metoda pozwala na szybkie obliczenie następnego stanu CRC po wprowadzeniu do niego "ćwierćbajtu" (2 bitów)

    Obrazek
    Rys. 31 Jaki będzie następny stan po wprowadzeniu "ćwierćbajtu" 01?
    Na początku w CRC było 101001 01 czeka na wejściu. Metoda pozwoli na szybkie ("w jednym ruchu") obliczenie następnego stanu 010011. Milcząco zakładamy oczywiście, że znany jest dzielnik 1011011. Następny rysunek pokazuje jak to zrobić.

    Rysunek 32 jest "złożeniem do kupy" rysunków 27,28,29 i 30 w części dotyczącej metody tablicowej (d,e,f)
    Obrazek
    Rys.32 Przykład metody tablicowej "ćwierćbajtowej"

    Rys. 32a przedstawia stan początkowy. CRC = 101001. Na wejściu "czeka" 01. Pod rejestrem CRC jest tablica 4 wierszowa, która "powstała" z rysunków 27d, 28d, 29d i 30d. Adres 3 wiersza 10 jest wytłuszczony, dlatego że "ćwierćbajt" sterujący (2 najstarsze bity CRC), też jest 10.

    Rys. 32b przedstawia CRC z bitami przesuniętymi o 2 pozycje w lewo. "Ćwierćbajt" sterujący wyjdzie na zewnątrz, a do rejestru wprowadzony będzie "czekający ćwierćbaj" 01. Teraz program będzie xor-ował CRC z wierszem o adresie wskazanym przez "wypchnięty" ćwierćbajt" sterujący -10. Wynik xor-owania na rys. 32c.

    Rys. 32c - Wynik końcowy CRC=010011
    Widzimy że metoda tablicowa "ćwierćbajtowa" pozwala na dwukrotne przyspieszenie obliczania następnego stanu CRC. Nic za darmo. Kosztem jest tablica. Czyli zapotrzebowanie na pamięć. Akurat w poważniejsszych mikrokontrolerach nie jest to problemem.

    Zarys programu obliczającego resztę CRC
    Niniejszy program będzie obliczał resztę CRC, tak obliczając następny stan CRC jak na rys. 32.
    Założenia.
    Dzielnikiem jest 1011011
    Z powyższego wynika że CRC jest 6-bitowe ( bo dzielnik 7-bitowy)
    Przesyłaną wiadomością dowolna liczba (więcej niż 6 bitowa oczywiście).
    Program w C-podobnym języku powinien policzyć resztę z dzielenia wiadomość:1011011
    Wcześniej w dyrektywach program założy tablice 4x6 (4 wiersze po 6 bitów) tak jak na rys. 32. Ten kawałek nie jest pokazany w poniższym programie.
    Wyzeruj rejestr CRC (6 bitów)
    Dopisz do wiadomości 000000
    WHILE(jeszcze nie jest wprowadzona cała wiadomość z zerami)
    {
    ... Zapamiętaj"ćwierćbajt" sterujący
    ...PRZESUŃ CRC o 2 bity w lewo i wprowadź 2 najstarsze bit wiadomości z zerami do CRC
    ...XOR-uj CRC z wierszem tablicy wskazanym przez "ćwierćbajt" sterujący
    }
    Gdy cała wiadomość z dołączonymi 6 zerami zostanie wprowadzona do CRC, to program wyjdzie z pętli WHILE {...}.
    W CRC będzie reszta z dzielenia wiadomość:1011011

    Rozdz. 14 Programowe obliczanie reszty CRC - metoda tablicowa BAJTOWA (8-bitowa)

    Porównanie metody ćwierćbajtowej i bajtowej rys.33 i 34
    Obrazek
    Rys.33 Metoda tablicowa ćwierćbajtowa
    Krótkie przypomnienie poprzedniego rozdziału.
    1 - wprowadzany jest jeden ćwierćbajt (2 bity)
    2 - dzielnik 7 bitowy (1bit + 3 ćwierćbajty)
    3 - rejestr CRC 3 ćwierćbajty (6 bitów)
    4 - tablica zawiera 4 wiersze po 3 ćwierćbajty (po 6 bitów)

    Rys 33a
    Stan początkowy rejestru CRC - ćwierćbajt 01 z prawej strony "czeka" na wprowadzenie

    Rys 33b

    Stan końcowy rejestru CRC - po wprowadzeniu ćwierćbajtu

    Rysunki c, d, e przedstawiają dokładnie jak realizowana jest modyfikacja rejestru CRC po wprowadzeniu ćwierćbajtu.
    Rys. 33c
    Stan początkowy rejestru CRC z tablicą - ćwierćbajt 01 z prawej strony "czeka" na wprowadzenie

    Rys. 33d
    Stan pośredni rejestru CRC z tablicą
    - przesunięcie rejestru o 2 bity w lewo ( w tym wprowadzenie ćwierćbajtu 01 i "wypchnięcie" ćwierćbajtu sterującego 10)
    - adresowanie wiersza wskazanego przez "wypchnięty" ćwierćbajt sterujący (10)
    - xor-owanie CRC przez adresowany wiersz 11 01 10. Wynik operacji na rys. 33e

    Rys. 33e
    - Wynik operacji
    Metoda ćwierćbajtowa nie jest raczej stosowana w praktyce. Ma tylko znaczenie dydaktyczne. Tablica jest tylko 4-wierszowa ponieważ są tylko 2 bity sterujące, Dlatego możliwa jest jeszcze dokładna analiza działania rejestru dla wszystkich 4 kombinacji bitów sterujących. Natomiast rządzą te same mechanizmy jak w metodzie bajtowej.

    Obrazek
    Rys.34 Metoda tablicowa bajtowa
    Jest to już metoda stosowana w praktyce. Tu akurat realizowany jest wielomian CRC-32 stosowany w internecie. Czyli jak czytasz ten tekst, coś tam kliknąłeś, to jakiś chochlik przy pomocy tablicy majstruje w CRC.
    W odróżnieniu od metody ćwierćbajtowej
    1 - wprowadzany jest jeden bajt (8 bitów)
    2 - dzielnik 33 bitowy (1bit + 4 bajty)
    3 - rejestr CRC 4 bajty (32 bity)
    4 - tablica zawiera 256 wierszy po 8 bajtów (po 32 bity) (256 = FF)
    Podkreślam, że na rys. 33 komórki są bitowe, na rys.34 bajtowe. Zawartość każdego bajtu przedstawiona jest tu w kodzie hexa. Metoda tablicowa bajtowa jest rozwinięciem metody ćwierćbajtowej z poprzedniego rozdziału. Różnice są tylko "ilościowe".

    Rys 34a
    Stan początkowy rejestru CRC - bajt 2D z prawej strony "czeka" na wprowadzenie. Liczba 1 04 A1 1D B7 odpowiada wielomianowi CRC-32. Bajtem sterującym jest 21=00100001.

    Rys 34b
    Stan końcowy rejestru CRC - po wprowadzeniu bajtu

    Rysunki c, d, e przedstawiają dokładnie jak realizowana jest modyfikacja rejestru CRC po wprowadzeniu bajtu 2D.

    Rys. 34c
    Stan początkowy rejestru CRC z tablicą - bajt 2D z prawej strony "czeka" na wprowadzenie.

    Rys. 34d
    Stan pośredni rejestru CRC z tablicą
    - przesunięcie rejestru o bajt w lewo (w tym wprowadzenie bajtu 2D i "wypchnięcie" bajtu sterującego21)
    - adresowanie wiersza wskazanego przez "wypchnięty" bajt sterujący (21)
    - xor-owanie CRC przez adresowany wiersz 14 23 B6 E0. Wynik operacji na rys. 34e

    Rys. 34e
    - Wynik operacji

    Tablice dla metody bajtowej są tworzone w sposób analogiczny jak dla metody ćwierćbajtowej i właściwie na tym można byłoby zakończyć artykuł. Dla czystego sumienia pokaże jednak jak to się robi.
    Bajt sterujący ma 8 bitów. Odpowiada to 256 różnym kombinacjom --> tablica będzie miała 256 wierszy 4 bajtowych. Wg tej samej zasady na rys. 33 tablica ma 4 wiersze 3 razy po ćwierć bajtu, ponieważ 2 bity sterujące dają 4 kombinacje. Oczywiście nie będę tworzył 256 4-bajtowych wierszy! Po prostu nie mam zdrowia. Dla przykładu stworzę tylko wiersz o adresie 00 i 21. Dlatego pozostałe wiersze tablic na rysunkach 34c, 34d i 34e wypełniłem przypadkowymi liczbami!.

    Kombinacja - bajt sterujący 00
    Obrazek
    Rys. 35 Jakie będzie CRC po wprowadzeniu bajtu ? - bajt sterujący 00
    Rys. 35 jest odpowiednikiem rys. 27. Różnice między rys. 27 i 35 są tylko ilościowe. Zasady są takie same.
    Rys. 27
    - CRC 3 x ćwierćbajtowe (6 bitowe)
    - 2 bity sterujące czyli prostokąt ma wysokość 3=2+1 wierszy (rys. 27a)
    - szerokość prostokąta 3 ćwierćbajty - 6 bitów (rys. 27a)
    - 2 wiersze "zerowe" między kreskami (rys. 27b)
    Rys. 35
    - CRC 4 x bajt (32 bity)
    - 8 bitów sterujących czyli prostokąt ma wysokość 9=8+1 wierszy (rys. 35a)
    - szerokość prostokąta ma 4 bajty - 32 bity (rys. 35a)
    - 8 wierszy "zerowych" między kreskami (35b)

    Rys. 35a - wersja algorytmu "rejestrowa"
    Na rys. 35a, 35b i 35c dane przedstawione są w kodzie binarnym, bo liczby te łatwo się xor-uje. W opisach natomiast przedstawione będą w kodzie hexa ze względu na ich "zwięzłość".
    Dzielnik 1 04 A1 1D B7 (Najstarszy bit zawsze 1, lecz tylko "czerwone" bity wpływają na algorytm)
    Aktualny stan CRC=00 72 B9 72 widoczny w górnym wierszu prostokąta (2D "czeka" na wejściu). Bit sterujący (najstarszy) CRC=0, dlatego bity będą tylko przesunięte w lewo. Tu znowu bit sterujący CRC=0 itd...Bity ponownie będą tylko przesunięte w lewo.
    W ten sposób wszystkie bity będą przesunięte w lewo o 1 bajt (8 bitów) i nowy stan CRC (9 "wytłuszczony" wiersz prostokąta) to CRC=72 B9 72 2D.

    Rys. 35b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Aktualny stan CRC + bajt "czekający" 00 72 B9 72 2D pod dolną kreską.
    8 czerwonych zerowych wierszy nad kreską odpowiada kolejnym przesunięciom w rejestrze CRC.
    Nad górną kreską (po xor-owaniu 8 zerowych wierszy) widzimy nowy "przesunięty" stan rejestru 72 B9 72 2D. Ten sam wynik jak w dolnym wierszu na rys. 35a.

    Rys. 35c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Bajty 00 00 00 00 są wynikiem xor-owania 8 wierszy na rys. 35 b.Wynik oczywiście taki sam jak w dolnym wierszu na rys. 35a.

    Rys. 35d Wersja tablicowa algorytmu dla bajtu sterującego 00 - stan początkowy
    wiersz tablicy o adresie 00 wynika bezpośrednio z rys. 35c
    W czarnym prostokącie jest początkowy stan rejestru CRC=00 72 B9 72 + bajt "czekający" 2D. Z bajtem sterującymi 00 związany jest wiersz o adresie też 00, zawierający 00 00 00 00

    Rys. 35e Wersja tablicowa algorytmu dla bajtu sterującego 00 - stan pośredni
    Bajty w rejestrze należy przesunąć o 1 pozycję w lewo. Następnie rejestr xor-ujemy z wierszem tablicy o adresie 00. czyli z 00 00 00 00. Wynik tego działania będzie widoczny na rys. 35f

    Rys. 35f Wersja tablicowa algorytmu dla bitów sterujących 00 - stan końcowy
    Akurat dla tego przypadku - xor-owanie przez zera rys. 35e i 35f są takie same.
    Taki sam wynik jak na rys. 35a.

    Kombinacja - bajt sterujący 21
    Obrazek
    Rys. 36 Jakie będzie CRC po wprowadzeniu bajtu ? - bajt sterujący 21

    Rys. 36a - wersja algorytmu "rejestrowa"
    Aktualny stan CRC=21 72 B9 72 widoczny w górnym wierszu prostokąta (2D "czeka" na wejściu). Pierwszy bit sterujący (najstarszy) CRC=0, dlatego bity będą tylko przesunięte w lewo. Tu znowu bit sterujący CRC=0 ,czyli bity znowu będą przesunięte w lewo. Ale teraz bit sterujący = 1. Czyli w następnym wierszu bity będą przesunięte w lewo i xor-owane z "czerwonymi' bitami dzielnika. Tak się szczęśliwie złozyło, że przy następnych przesunięciach, bity sterujące będą zerowe . Czyli będą tylko gołe przesunięcia, bez xor-owań. W ten sposób po przesunięciu o bajt, dojdziemy do wytłuszczonego wiersza nr 9 ze stanem CRC= 66 9A C4 CB .
    Uwaga Tylko jeden wiersz "do xor-owania", to tylko przypadek! Przy innym bajcie sterującym, mogłoby być ich np. 5 a nawet 8.

    Rys. 36b - Wstępna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Aktualny stan CRC + bajt "czekający" 21 72 B9 72 2D pod dolną kreską.
    7 czerwonych zerowych wierszy odpowiada gołym przesunięciom w rejestrze CRC. Wiersz nr 3 - z czerwonymi bitami dzielnika, odpowiada przesunięciu i xor--owaniu. Przy innych danych takich wierszy mogło być oczywiście więcej.
    Nad górną kreską widzimy nowy stan rejestru 66 9A C4 CB. Taki sam wynik jak w dolnym wierszu na rys. 36a.

    Rys. 36c - Ostateczna wersja algorytmu "xor-owania pisemnego z 2 kreskami"
    Bajty 14 23 B6 E0 są wynikiem xor-owania 8 wierszy na rys. 36 b.Wynik oczywiście taki sam jak w dolnym wierszu na rys. 36a.

    Rys. 36d Wersja tablicowa algorytmu dla bajtu sterującego 21 - stan początkowy
    wiersz tablicy o adresie 21 wynika bezpośrednio z rys. 36c
    W czarnym prostokącie jest początkowy stan rejestru CRC=21 72 B9 72 + bajt "czekający" 2D. Z bajtem sterującymi 21 związany jest wiersz o adresie też 21, zawierający [img]14%2023%20B6%20E0[/img]

    Rys. 36e Wersja tablicowa algorytmu dla bajtu sterującego 21 - stan pośredni
    Bajty w rejestrze należy przesunąć o 1 pozycję w lewo. Następnie rejestr xor-ujemy z wierszem tablicy o adresie 21. czyli z 14 23 B6 E0. Wynik tego działania będzie widoczny na rys. 36f

    Rys. 36f Wersja tablicowa algorytmu dla bitów sterujących 21 - stan końcowy
    Taki sam wynik jak na rys. 36a.

    Zarys programu obliczającego resztę CRC-32
    Niniejszy program będzie obliczał resztę CRC-32, tak obliczając następny stan CRC jak na rys. 34. Jest prawie kopią programu z rozdz. 13.
    Założenia.
    Dzielnikiem jest 1 04 A1 1D B7
    Z powyższego wynika że CRC jest 4-bajtowe (32 bo bo dzielnik 33-bitowy)
    Przesyłaną wiadomością dowolna liczba (więcej niż 4 bajty oczywiście).
    Program w C-podobnym języku powinien policzyć resztę z dzielenia wiadomość:1 04 A1 1D B7
    Wcześniej w dyrektywach program założy tablice 256x4 bajty (256 wierszy po 4 bajty) tak jak na rys. 34. Ten kawałek nie jest pokazany w poniższym programie.
    Wyzeruj rejestr CRC (4 bajty)
    Dopisz do wiadomości 00 00 00 00
    WHILE(jeszcze nie jest wprowadzona cała wiadomość z zerami)
    {
    ...Zapamiętaj bajt sterujący
    ...PRZESUŃ CRC o 1 bajt w lewo i wprowadź najstarszy bajt wiadomości z zerami do CRC
    ...XOR-uj CRC z wierszem tablicy wskazanym przez bajt sterujący
    }
    Gdy cała wiadomość z dołączonymi 32 zerami zostanie wprowadzona do CRC, to program wyjdzie z pętli WHILE {...}.
    Wtedy w CRC będzie reszta z dzielenia wiadomość:1 04 A1 1D B7

    powrót do części 1 LINK



    Ostatnio edytowano 12 lut 2018, o 12:32 przez mg101, łącznie edytowano 12 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lip 2013, o 20:06 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 sty 2013
    Posty: 328
    Lokalizacja: Rzgów k. Łodzi
    Pomógł: 11

    FENOMENALNY tutorial ! Wielkie dzięki za to. Na razie tylko pobieżnie rzuciłem okiem, "przerzucie" tej wiedzy z pewnością zajmie mi trochę czasu i na pewno przyda mi się to ;). I jeszcze raz wielkie dzięki ;)

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lip 2013, o 20:49 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Ja też zacząłem czytać - i już z niecierpliwości po prostu najpierw rzuciłem szybko okiem na całość i na rysunki ....

    szczęki jeszcze zbieram z podłogi ... ;) pełną ocenę dam po przeczytaniu całości .... ale już sam wstęp o kowalskim co to pożyczył kasę ... nieeee ... no zapowiada się mega-zaje-fajnie ;)

    a miałem teraz wieczorkiem co innego porobić - za to będę czytał i czytał ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lip 2013, o 21:03 
    Offline
    Moderator zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 18 lip 2012
    Posty: 3224
    Lokalizacja: Kraków - obok FAB5 ATMEL'a
    Pomógł: 91

    Dobra Mirku, przeniosę, w ramach czynu społecznego ZSMP.

    _________________
    http://www.jaglarz.info



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lip 2013, o 21:05 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Jaglarz napisał(a):
    Dobra Mirku, przeniosę, w ramach czynu społecznego ZSMP.


    aha ok bo ja już pierwszy rysunek przeniosłem z pierwszej części ale też troszkę uporządkowałem startowe rysunki żeby główna strona portalu się nie rozjeżdżała

    ale zaraz Jagi poczekaj

    wiesz co ? może ja przeniosę - a że poradnik jest świetny to dodam znak wodny naszego forum na rysunki - będzie troszkę roboty ale zrobię to z przyjemnością ok

    nie obrazisz się?

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lip 2013, o 21:53 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Antystatyczny napisał(a):
    A ja się zastanawiałem, czy słusznie czynię przenosząc to do ogłoszeń :) Stwierdziłem jednak, że to wiedza fundamentalna i musi być lepiej widoczna ;)


    Tak Anty ale mamy dwie części - poza tym jak się daje do ogłoszeń a na górze jest jakiś za duży obrazek to strasznie deformuje się pierwsza strona portalu

    dlatego na razie robię porządek z obrazkami i już pierwsza część wisi GLOBALNIE jak widzisz na stronie portalu - dzięki niej można będzie łatwo trafić do drugiej - zaraz na końcu zorganizuję LINK jeszcze - no i całą grafikę wraz z Jagim zaczęliśmy przenosić z kociego imageshacka na nasz serwer - a ja kończę i jeszcze robię tło wodne naszego forum na obrazkach

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 lip 2013, o 06:34 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Nie mogłem się doczekać i rano wstałem żeby chociaż kawałek poczytać sobie na spokojnie. Na razie zdążyłem przeczytać prawie 50% części pierwszej i już mi się hmm rozjaśniło o co chodzi ;) wcześniej miałem zatyczkę w głowie na etapie startu obliczania sumy z przesyłanej liczby - chodzi mi o zasadę - a tu ??? .... no w końcu ktoś pokazał to bez ...

    mg101 napisał(a):
    Odpuściłem sobie opracowania z dużą ilością teorii. Jakieś algebry wielomianów, ciała Galois, lematy, twierdzenia i inne bajadery.


    BRAWO ! - bo okazuje się , że metodą tzw łopatologiczną można prościej a zrozumie to praktycznie każdy ....

    Dobra lecę do roboty - resztę wrażeń i ocen artykułu opiszę później ;) .... ale znowu dodam - KAWAŁ DOBREJ ROBOTY kolega mg101 wykonał.

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 lip 2013, o 08:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 07 kwi 2013
    Posty: 418
    Lokalizacja: Rzeszów
    Pomógł: 102

    Może dodam swoją funkcję do obliczania 8-mio bitowego CRC, którego używam od jakiegoś czasu:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Typ uint64_t może się okazać za duży, dlatego można go zmieniać w zależności od wielkości danych wejściowych.

    Użycie dla kilku bajtów danych:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 lis 2014, o 14:04 
    Offline
    Nowy

    Dołączył(a): 04 paź 2014
    Posty: 2
    Pomógł: 0

    Słowa uznania i pochwały dla autora za niemały wkład pracy włożony w opracowanie zagadnienia na tak wysokim poziomie merytorycznym!

    Dziwi jednak fakt, iż pomimo blisko 16-to miesięcznego okresu od publikacji nikt nie zwrócił uwagi na istotne błędy występujące w poradniku.

    Pomijając drobne błędy w postaci nieprawidłowych odnośników do obrazków czy czeskich błędów np. pod rys. 34:
    4 - tablica zawiera 256 wierszy po 8 bajtów (po 32 bity) (256 = FF) - oczywiście zawiera 256 wierszy po 4 bajty (32bity).

    W artykule od rozdziału 14 są bardzo poważne blędy!
    Wartość generatora/dzielnika dla CRC32 wynosi 0x04C11DB7, natomiast autor podaje (1) 04 A1 1D B7 - zamiast watrtości A ma być C. Wykorzystanie tego generatora daje nieprawidłowe wyniki w dalszych obliczeniach.

    Rys. 36 kombinacja dla bajtu sterującego 21 jest nieprawidłowo obliczona (ta nieprawidłowa wartość wykorzystywana jest też wcześniej). Poza tym zdaje się przedstawia tworzenie bajtu dla algorytmu tablicowego nieodwróconego - pamiętajmy o tym podczas analiz, podczas transmisji danych często wykorzystuje się algorytm tablicowy odwrócony ze względu na inną kolejność przesyłania poszczególnych bitów (najpierw LSB).


    Jako uzupełnienie i można powiedzieć 3 część tego opracowania polecam lekturę:
    http://uhex.blogspot.com/2014/11/tworze ... onego.html



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 lis 2014, o 15:02 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Dziękuję w imieniu autora za cenne uwagi, pewnie jeśli autor to zobaczy to się odniesie i wprowadzi poprawki. Trzeba jednak mieć na uwadze że w tak obszernym materiale każdemu może się ręka omsknąć ;)

    przy okazji fajny blog kolega polecił.

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 lis 2014, o 15:08 
    Offline
    Nowy

    Dołączył(a): 04 paź 2014
    Posty: 2
    Pomógł: 0

    Dlatego tak istotny jest feedback od czytelników :)
    Konstruktywna krytyka pozytywnie wpływa na udoskonalanie produktów - w tym przypadku tego poradnika. Pozwoli innym uniknąć cennych godzin spędzonych na poszukiwaniach błędu.

    Pozdrowienia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 lis 2014, o 15:09 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Dokładnie jak mówisz, więc to się nazywa po prostu pomoc a nie krytyka ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 sty 2016, o 14:38 
    Offline
    Użytkownik

    Dołączył(a): 18 sty 2015
    Posty: 170
    Pomógł: 0

    Zakładam, że znalezione błędy zostały poprawione (właśnie zabieram się za czytanie ;-).

    Ogarnąłem teorię programowania flash AVR z poziomu bootloadera (umiem to zrobić) ale przed sensownym użyciem pozostaje implementacja CRC.
    Być może będę przepychał do uC całą, pojedynczą stronę kodu maszynowego (generując wcześniej CRC) a następnie sprawdzał blok po stronie uC (bootloadera) i podejmował decyzję o sapisie strony lub nie. Być może z lektury tekstu wyniknie, czy warto sprawdzać cały blok (128 słów = 256 bajtów) czy może warto podzielić strony na mniejsze bloki.

    Znikam czytać i pozdrawiam.
    Mariusz



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 sty 2016, o 19:55 
    Offline
    Użytkownik

    Dołączył(a): 27 lis 2012
    Posty: 291
    Pomógł: 6

    Przepraszam
    To miało być na PW



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 sty 2016, o 20:42 
    Offline
    Użytkownik

    Dołączył(a): 18 sty 2015
    Posty: 170
    Pomógł: 0

    "Pierwsze czytanie" mam już za sobą. Tekstów kolegi mg101 naprzemiennie z pierwowzorem z EP.

    Przyznam, że temat (generalnie) wygląda obszernie. Stąd naszła mnie chęć, by może zacząć od... praktyki, a za teorię zabrać się w międzyczasie.
    Biorąc pod uwagę najprostsze środowisko, jakie (nieprzyzwoicie) przychodzi mi do głowy mamy coś takiego:

    http://avrhelp.mcselec.com/index.html?crc32.htm

    Z tego co wylicza zaimplementowana, gotowa do użycia procedura, wynika, że suma CRC32 dla tablicy [1, 2, 3] wynosi 494976085.

    Tyle potrafię zrobić z palca po stronie uC, choćby i w tej chwili.

    Teraz najchętniej uruchomiłbym CodeBlocks (C++) i wypróbował jakąś gotową bibliotekę do liczenia crc32, tworząc taką samą tablicę [1, 2, 3] w celu sprawdzenia, czy obliczona zostanie taka sama suma kontrolna.

    Zdaje się, że coś gotowego znalazłem:
    https://fossies.org/dox/codeblocks_13.1 ... _8cpp.html
    https://fossies.org/dox/codeblocks_13.1 ... ource.html



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO