Раз пошла такая пьянка

, я делаю вот так - и быстро, и мало по памяти.
Для восьмой меги, для других - править конечный адрес 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
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин