реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Быстрое вычисление CRC-8, Потенциальные возможности не табличных методов
_Bill
сообщение Sep 4 2006, 12:33
Сообщение #31


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(aaarrr @ Sep 4 2006, 14:31) *
Как это не зависят?
Одно дело, когда таблица выровнена по границе 256 байт, и не пересекает следующую:
Код
ldi    ZH, high(table * 2)
mov    ZL, offset
lpm
...

другое, когда таблица не выровнена по границе 256 байт:
Код
ldi    ZH, high(table * 2)
ldi    ZL, low(table * 2)
add    ZL, offset
lpm
...

и совсем другое, когда не выровнена по границе 256 байт, и пересекает следующую:
Код
ldi    ZH, high(table * 2)
ldi    ZL, low(table * 2)
add    ZL, offset
brcc   PC+0x02
inc    ZH
lpm
...


Разница по скорости почти в 2 раза: 5 и 8 тактов.


"Расход" стека случается только при использовании вложенных подпрограмм. Как правило, программы уровня PIC16 позволяют обойтись минимальным количеством вложений.

Если расчитывать на определенное размещение таблицы в памяти, тогда согласен. Но в случае использования линкера, расположение таблицы обычно заранее неизвестно, и расчитывать на это не стоит. Поэтому нужно использовать наиболее общий случай, только я бы сделал код для этого чуточку проще:
Код
     mov  ZL,  offset          ; offset, offset+1 - регистры для смещения (индекса)
     mov  ZH, offset+1             ;
     sbi  ZL, -low(table*2)    ; Вычислить точку входа в таблицу.
     sbci ZH, -high(table*2)       ;
     lpm  R16                  ; Выбрать байт

Необходимо только 4 такта накладных расходов. Но доступ по индексу требует больше накладных расходов и, соответственно времени. Поэтому при последовательном доступе к элементам таблицы лучше воспользоваться методом доступа по указателю, чего в PIC16 вообще нет:
Код
     ldi  ZH, high(table*2)    ; Установить указатель таблицы
     ldi  ZL. low(table*2)           ;
............
     lpm  R16, Z+              ; Выбрать очередной элемент таблицы
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 4 2006, 13:06
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(_Bill @ Sep 4 2006, 16:33) *
Поэтому при последовательном доступе к элементам таблицы лучше воспользоваться методом доступа по указателю, чего в PIC16 вообще нет

Как нет и в AVR времен PIC16 smile.gif
Go to the top of the page
 
+Quote Post
_Bill
сообщение Sep 4 2006, 13:13
Сообщение #33


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(aaarrr @ Sep 4 2006, 16:06) *
Цитата(_Bill @ Sep 4 2006, 16:33) *

Поэтому при последовательном доступе к элементам таблицы лучше воспользоваться методом доступа по указателю, чего в PIC16 вообще нет

Как нет и в AVR времен PIC16 smile.gif

Само собой. Они там (в AVR) немного меньше.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 5 2006, 12:28
Сообщение #34


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Oldring @ Sep 4 2006, 00:44) *
Это точно не CRC

Да это не срс, ошибся. Даже знаю примерно, где ошибся. Почему-то необоснованно полагал, что при расчете текущего байта предыдущее состояние генератора - нулевое.

Тем не менее считаю, что дискуссия была полезной, мне-то уж точно(:-). Спасибо всем участникам.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Smen
сообщение Jul 1 2013, 13:37
Сообщение #35


Местный
***

Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081



Дяденьки, подскажите, плиз! crying.gif
Если у меня принимаются байты (по UART, если что), в которых, только семь младших битов информационные, а старший - служебный (определяет начало посылки), то какой алгоритм брать, CRC-8, или CRC-7?
Нашёл тут расчёт CRC-7, но там всё-равно "обрабатываются" все восемь битов, а затем старший бит принудительно обнуляется.
Go to the top of the page
 
+Quote Post
zombi
сообщение Jul 1 2013, 19:01
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(Smen @ Jul 1 2013, 16:37) *
какой алгоритм брать, CRC-8, или CRC-7?

Считайте CRC-8 и не морочьте себе голову.
Но учтите что :
Цитата(plombir @ Feb 18 2009, 09:11) *
Назначение CRC это гарантированное обнаружение одинарных, двойных, тройных и нечетных ошибок при максимальной длине блока: 15, 4095, 268435455 байт, соответственно для CRC 8, 16, 32.

Go to the top of the page
 
+Quote Post
Smen
сообщение Jul 2 2013, 06:02
Сообщение #37


Местный
***

Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081



Цитата(zombi @ Jul 1 2013, 23:01) *
Считайте CRC-8 и не морочьте себе голову.
Так, а будет ли CRC-8, у которого обрезан старший бит выполнять свои функции?

Цитата(zombi @ Jul 1 2013, 23:01) *
Назначение CRC это гарантированное обнаружение одинарных, двойных, тройных и нечетных ошибок при максимальной длине блока: 15, 4095, 268435455 байт, соответственно для CRC 8, 16, 32.
А разве это не от полинома зависит?
Я правильно понял, что для CRC-8 максимальная длинна блока 8 байт (что б все ошибки гарантированно обнаруживались)?
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 05:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01445 секунд с 7
ELECTRONIX ©2004-2016