Есть два варианта функции вычисления CRC:
Код
unsigned char code[8]={0x01,0xd0,0x5e,0x3c,0x0d,0x00,0x00,0x84};
unsigned char crc8_1(unsigned char *buff,unsigned char num)
{
unsigned char i=0,j,tmp,data,crc=0;
for (i=0;i<num;i++) {
data=*buff++;
for (j=0;j<8;j++) {
tmp=1&(data^crc);
crc>>=1;
data>>=1;
if (tmp!=0) crc^=0x8c;
}
}
return crc;
}
unsigned char crc8_2(unsigned char *buff,unsigned char num)
{
unsigned char i=num,j,tmp,data,crc=0;
for (;i>0;i--) {
data=*buff++;
for (j=8;j>0;j--) {
tmp=1&(data^crc);
crc>>=1;
data>>=1;
if (tmp!=0) crc^=0x8c;
}
}
return crc;
}
int main(int argc, char* argv[])
{
unsigned char crc_;
crc_=crc8_1(code,7);
crc_=crc8_2(code,7);
return 0;
}
Как видно из рисунка, это собственно один и тот же алгоритм.
Но, при компиляции под WinAVR(gcc), при любом уровне оптимизации, второй
вариант работает на 10-15% быстрее.
Собственно вопрос: а есть ли компилятор который может скомпилировать
эти две(одинаковых!) функции в одинаковый(быстрый) код ?