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



Teraz jest 26 kwi 2024, o 10:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 21 wrz 2017, o 11:58 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 15 lis 2015
Posty: 23
Lokalizacja: Lesznowola (południowe okolice Wa-wy)
Pomógł: 1

Cześć,

Proszę o pomoc / potwierdzenie czy dobrze rozumiem.

Potrzebuję skorzystać z CRC32 do weryfikacji poprawności przechowywanych danych. Znalazłem w sieci gotową procedurę, którą próbuję zaadaptować do środowiska AVR (ATmega328PB):
http://www.hackersdelight.org/hdcodetxt/crc.c.txt

Na stronie jest kilka różnych implementacji, ja korzystam z implementacji crc32b. Poniżej oryginalny listing:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czy dobrze rozumiem, że:
a) powyższy przykład pochodzi z systemu, gdzie typ int ma rozmiar 4 bajtów (świadczy o tym przypisanie do zmiennej crc wartości 0xFFFFFFFF)
b) zatem dla AVR należy go odpowiednio zmodyfikować, w krytycznych miejscach zmieniając typy int na uint32_t - jak na poniższym drugim listingu
c) dążąc do perfekcji należało by dodatkowo również dla zmiennej j zmienić typ int na uint8_t (oszczędzając 1 bajt)

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


Będę wdzięczny za Wasze uwagi / potwierdzenie / korektę mojego rozumowania.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2017, o 14:17 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Jagermeister napisał(a):
należało by dodatkowo również dla zmiennej j zmienić typ int na uint8_t (oszczędzając 1 bajt)

Raczej na int8_t, bo masz tam warunek j >= 0;

Oczywiście wiesz, że ta funkcja nie nadaje się do obliczania CRC danych binarnych, tylko do ciągów znaków?

Możesz ewentualnie spróbować użyć gotowych funkcji przystosowanych dla AVR, na przykład:
http://community.atmel.com/projects/crc32-calculation-functions


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2017, o 14:48 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 15 lis 2015
Posty: 23
Lokalizacja: Lesznowola (południowe okolice Wa-wy)
Pomógł: 1

Bardzo dziękuję za odpowiedź.

Re.1.
Nie rozumiem dlaczego nie może być uint8_t. Wydaje mi się, że zakres uint8_t wynosi od 0 do 255, czyli warunek j>= 0 nie powinien kolidować z tym zakresem.


Re.2.
Nie byłem świadom, że znaleziona funkcja nie nadaje się do danych binarnych. Z czego wynika to ograniczenie?

Znalazłem ją w wątku https://stackoverflow.com/questions/21001659/crc32-algorithm-implementation-in-c-without-a-look-up-table-and-with-a-public-li gdzie była polecana jako nadająca się do bootloader'a. A bootloader głównie ma do czynienia z danymi binarnymi.

Zależy mi na funkcji z małym zapotrzebowaniem na pamięć, kosztem większej liczby instrukcji do wykonania. Większość znalezionych funkcji do obliczania crc32, włącznie z przytoczoną przez Ciebie z zasobów Atmel, używa sporej tablicy. Przykładowo ta z Atmela potrzebuje tablicy 256 elementów 4 bajtowych = 1 kB.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2017, o 15:34 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 15 lis 2015
Posty: 23
Lokalizacja: Lesznowola (południowe okolice Wa-wy)
Pomógł: 1

Odnosnie zagadnienia #2 to wiem, że dla danych binarnych warunek while (message[i] != 0) jest problemem.

Oczywiście przerobiłem sobie dodajac dodatkowy parametr "dlugosc danych do przetworzenia" i zmieniajac while na for.

Czy widzisz jakies inne ograniczenia?

Wysłane z mojego SM-G903F przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2017, o 15:35 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Jagermeister napisał(a):
Nie rozumiem dlaczego nie może być uint8_t. Wydaje mi się, że zakres uint8_t wynosi od 0 do 255, czyli warunek j>= 0 nie powinien kolidować z tym zakresem.

Zmienna typu uint8_t jest zawsze większa lub równa zero, czyli warunek jest zawsze spełniony i program nie wyjdzie z pętli for.

Jagermeister napisał(a):
Nie byłem świadom, że znaleziona funkcja nie nadaje się do danych binarnych. Z czego wynika to ograniczenie?

Nie wiem, czy to nazwać ograniczeniem, ale taka jest po prostu konstrukcja (przeznaczenie) funkcji, ponieważ argumentem funkcji jest wskaźnik na typ char i funkcja kończy obliczanie CRC po napotkaniu bajtu równego 0:
while (message[i] != 0)

Dla ciągu znaków 0 jest znakiem unikalnym i oznacza koniec ciągu (jeśli mówimy o języku C). W danych binarnych bajt o wartości 0 jest sytuacją naturalną.

Można oczywiście przerobić funkcję, aby obsługiwała dane binarne, jednak będzie to wymagało dodania drugiego argumentu informującego o rozmiarze danych w bajtach.

EDIT: Sorry, ale mała przerwa na obiad i nie zauważyłem Twojej odpowiedzi ;)

Jagermeister napisał(a):
Oczywiście przerobiłem sobie dodajac dodatkowy parametr "dlugosc danych do przetworzenia" i zmieniajac while na for.

...no i jeszcze ta zmienna j powinna być typu int8_t zamiast uint8_t i powinno być OK :)
Musisz sprawdzić sam, bo ja nie mam możliwości w tej chwili tego przetestować ;)

_________________
AVR-GCC - dane w pamięci FLASH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2017, o 15:48 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 15 lis 2015
Posty: 23
Lokalizacja: Lesznowola (południowe okolice Wa-wy)
Pomógł: 1

100% racji - nie zauważony problem z petlą nieskończoną dla typu uint8_t prawdopodobnie bym rozwiązywał przez kilka godzin.

Dziękuję za wytłumaczenie.


Wysłane z mojego SM-G903F przy użyciu Tapatalka



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: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 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