Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
U32 CalcCrc (unsigned char *pdata, int count)
{
union
{
U32 POLY;
struct
{
unsigned char POLY0;
unsigned char POLY1;
unsigned char POLY2;
unsigned char POLY3;
};
};
union
{
U32 CRC;
struct
{
unsigned char BCRC0;
unsigned char BCRC1;
unsigned char BCRC2;
unsigned char BCRC3;
};
};
union
{
U32 TAP;
struct
{
unsigned char TAP0;
unsigned char TAP1;
unsigned char TAP2;
unsigned char TAP3;
};
};
CRC = 0;
TAP = 0;
POLY = 0x00400007;
char CRCF = 0;
for (int i = 0; i < count; i++)
{
if (CRC & (1<<31))
CRCF = 1; else CRCF = 0;
CRC <<= 1;
TAP = 0;
unsigned byte = *pdata++;
if (byte & 0x01) TAP |= (1 << 0);
if (byte & 0x02) TAP |= (1 << 3);
if (byte & 0x04) TAP |= (1 << 5);
if (byte & 0x08) TAP |= (1 << 8);
if (byte & 0x10) TAP |= (1 << 10);
if (byte & 0x20) TAP |= (1 << 13);
if (byte & 0x40) TAP |= (1 << 16);
if (byte & 0x80) TAP |= (1 << 18);BCRC0 ^= TAP0;
BCRC1 ^= TAP1;
BCRC2 ^= TAP2;
BCRC3 ^= TAP3;if (CRCF)
{
BCRC0 ^= POLY0;
BCRC1 ^= POLY1;
BCRC2 ^= POLY2;
BCRC3 ^= POLY3;
}
}return CRC;
}