[an error occurred while processing this directive]
CRC-16 продолжение...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Boris Barbaris 23 августа 2002 г. 03:35


Посмотрел я еще раз - тот расчет CRC-16, что привел
Володя Полетаев:

typedef unsigned char byte;
byte crc16h, crc16l;
void UpdateCRC16(byte c){
c ^= crc16h;
c ^= (c >> 4);
crc16h = crc16l ^ (c << 4) ^ (c >> 3);
crc16l = c ^ (c << 5);
}

полностью соответствует табличному расчету CRC X-модема

void crc16(byte bt){
crc = CrcTable[(crc>>8)^bt] ^ (crc<<8);
}

с таблицей

unsigned int CrcTable[256] = {

0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
..............................................................
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
};


В обоих случаях происходит следующая комбинация бит:


Исходная сумма: A15..A0
Входной байт: B7..B0
Новая сумма: C15..C0
Примечание: биты в каждой строке XOR'ятся

C15_:=_A7_____________________________A11_B3_A15_B7
C14_:=_A6_____________________________A10_B2_A14_B6
C13_:=_A5_____________________________A9__B1_A13_B5
C12_:=_A4_______________A15_B7________A8__B0_A12_B4
C11_:=_A3_______________A14_B6_____________________
C10_:=_A2_______________A13_B5_____________________
C9__:=_A1_______________A12_B4_____________________
C8__:=_A0_______________A11_B3_A15_B7______________
C7__:=____A15_B7________A10_B2_A14_B6______________
C6__:=____A14_B6________A9__B1_A13_B5______________
C5__:=____A13_B5________A8__B0_A12_B4______________
C4__:=____A12_B4___________________________________
C3__:=____A11_B3_A15_B7____________________________
C2__:=____A10_B2_A14_B6____________________________
C1__:=____A9__B1_A13_B5____________________________
C0__:=____A8__B0_A12_B4____________________________


А вот Атмеловский посчет AVR350 XmodemCRC из doc1472.pdf:

int calcrc(char *ptr, int count){
int crc; char i;
crc = 0;
while (--count >= 0){
crc = crc ^ (int) *ptr++ << 8;
i = 8;
do{
if (crc & 0x8000) crc = crc << 1 ^ 0x1021;
else crc = crc << 1;
} while(--i);
}
return (crc);
}

отличается отсутствием битов B3..B0 в строчках C15..C12,
если я правильно проследил за алгоритмом.


Я еще немного прооптимизировал первый из алгоритмов для
Инфинеоновского C166 (учел его 16-битность) и вышло, что
нетабличный алгоритм выполняется ровно столько же,
сколько и табличный. Я даже сам не ожидал такого впечатляющего
результата, ведь прямой расчет при обычной реализации втрое
медленнее табличного!


Параметры:
RL0=байт для посчета;
R1=вх/вых контрольная сумма

Табличный расчет CRC для Infineon C166
(9+256 слов, 10 тактов):
(если убрать exts #SEG,(через DPP) можно сократить до 8 тактов)

xorb RL0,RH1
movb RH0,#0
shl R0,#1
exts #SEG(TableCRC),#1
mov R0,[R0+#SOF(TableCRC)]
xorb RH0,RL1
mov R1,R0

Не табличный расчет CRC для Infineon C166
(10 слов, 10 тактов):

xorb RH1,RL0
movbz R0,RH1
shr R0,#4
xorb RL0,RH1
movb RH1,RL1
movb RL1,RL0
shl R0,#5
xor R1,R0
shl R0,#7
xor R1,R0

(c) Boris Barbaris


Контрольная сумма строчки "123456789" = 31C3h (начальная сумма=0)



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru