Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CRC16 speed and compact
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
afe
lichno pol'zoval v svoix project'ax neodnokratno

Pls: perenesite v etu temu:

! Исходники программ и библиотек
Rst7
Раз пошла такая пьянка wink.gif, я делаю вот так - и быстро, и мало по памяти.
Для восьмой меги, для других - править конечный адрес FLASH

#include "iom8.h"
#include "inavr.h"
#include "pgmspace.h"

unsigned int CRC(void)
{
char __flash *p;
char h12=0;
char h0=0;
char h1;
char hl5;
char hh5;

p=0;
do
{
h1=h12; //F E D C B A 9 8
h12=__swap_nibbles(h12); //B A 9 8 F E D C
hh5=h12; //B A 9 8 F E D C
h12^=h1; //FB EA D9 C8 BF AE 9D 8C
h12&=0xF0; //FB EA D9 C8 _ _ _ _
hh5&=0x0F; //_ _ _ _ F E D C
h1^=hh5; //F E D C FB EA D9 C8
hl5=h12; //FB EA D9 C8 _ _ _ _
{
unsigned int i=(hh5<<8)|hl5; //_ _ _ _ F E D C FB EA D9 C8 _ _ _ _
i<<=1;
hh5=i>>8; //_ _ _ F E D C FB
hl5=(char)i; // EA D9 C8 _ _ _ _ _
}
h1^=hl5; //crclo // FEA ED9 DC8 C FB EA D9 C8
h12^=hh5; //crchi //FB EA D9 FC8 E D C FB

h12^=h0;
h0=h1^((unsigned int)p<0x1FFE?(*p):0);
p++;
}
while((unsigned int)p<0x2000);
return(((h12<<8)|h0)!=*(unsigned int __flash *)0x1FFE);
}

void main(void)
{
if (CRC())
{
printf_P((PGM_P)"Flash CRC error!");
}
}

Заточено специально для IAR - тест программной памяти. В опциях проекта (линкера) надо ставить:
Fill unused code memory
Generate checksum
Size 2 bytes
CRC16 (0x11021)
Complement As Is
Bit order: MSB first
GxOST
Цитата(afe @ Mar 1 2006, 07:09) *
lichno pol'zoval v svoix project'ax neodnokratno


кстати, процедура для генерации этой таблицы такая:
Код
void initcrc16tab(void)
{
      register  b, v, i;

      for( b = 0; b <= (1<<B)-1; ++b )
      {
            for( v = b<<(W-B), i = B; --i >= 0; )
                  v = v&0x8000 ? (v<<1)^P : v<<1;
            crc16_table[b] = v;
      }
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.