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, Asembler, Szybkie liczenie CRC8, x^8+x^5+x^4+1, 1-Wire

Toreno 31 Sty 2012 18:28 1605 5
REKLAMA
  • #1 10475571
    Toreno
    Poziom 2  
    Witam serdecznie,

    Zależy mi na szybkim policzeniu CRC8 dla pojedynczego bitu w 1-Wire.
    Poniżej zamieściłem kod w asemblerze, który przygotowałem. Obecnie
    nie mam możliwości sprawdzenia jego funkcjonalnej poprawności.
    Czy mógłbym prosić o sprawdzenie tego kodu, ew. jeśli ktoś chciałby
    podzielić sie czymś szybszym, byłbym bardzo wdzięczny!

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Objaśnienie:
    r16 - rejestr używany jako tymczasowy
    owrInData - rejestr z danymi, istotny najmłodszy bit
    owrCRC8 - rejestr zawierający wynik z poprzedniego liczenia
    0x0C - To wartość wielomianu, 0x18 przesunięta o jeden w prawo

    Pozdrawiam,
    Toreno
  • REKLAMA
  • #2 10475648
    Pituś Bajtuś
    Poziom 28  
    Pierwszy z brzegu przykład : CRC 1-wire ale nie wiem czy będzie szybszy.
  • REKLAMA
  • #3 10477393
    Toreno
    Poziom 2  
    Niestety. Potrzebuję algorytm obliczania CRC8 dla pojedynczego bitu, nie wolniejszy niż 8 CK. Czy ktoś jest w stanie sprawdzić poprawność mojego kodu?
  • REKLAMA
  • #4 10478514
    Toreno
    Poziom 2  
    Ok, już sprawdziłem powyższy kod. Jak się okazało, jest w nim błąd.

    Instrukcja ROR, mogłaby być wykorzystana, gdyby flaga C zawierała
    wartość najmłodszego bitu rejestru przed wykonaniem operacji.
    Zamiast ROR, użyłem więc kolejno instrukcji BST, LSR, BLD, niestety
    kod wydłużył się o 2 CK.

    Czy ktoś ma pomysł na zoptymalizowanie tego kodu?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #6 10481191
    Toreno
    Poziom 2  
    Dzięki wielkie JarekC!

    Bardzo mi pomogłeś, kod już sprawdziłem, działa perfekcyjnie.
    Wykonuje się w czasie 6-7 CK, zatem szybciej niż oczekiwałem :)

    Gdyby ktoś chciał skorzystać, zamieszczam jeszcze raz pełny kod
    wraz z objaśnieniami i oznaczam temat jako zamknięty :)

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Objaśnienia:
    r16 - rejestr używany jako tymczasowy
    owrInData - rejestr z danymi, istotny najmłodszy bit
    owrCRC8 - rejestr zawierający wynik z poprzedniego liczenia
    0x0C - To wartość wielomianu, 0x18 przesunięta o jeden w prawo

    Jeszcze raz dzięki wielkie!
    Pozdrawiam,
    Toreno
REKLAMA