Ловите:
//Расчёт CRC32 полином == 0xEDB88320
//buf - данные, len - длина, crc - init value
u32 CRC32(void const *buf, int len, u32 crc)
{
static u32 const t[] = {
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x00000000, 0x1DB71064, 0x3B6E20C8, 0x26D930AC,
0x76DC4190, 0x6B6B51F4, 0x4DB26158, 0x5005713C,
0xEDB88320, 0xF00F9344, 0xD6D6A3E8, 0xCB61B38C,
0x9B64C2B0, 0x86D3D2D4, 0xA00AE278, 0xBDBDF21C};
u8 const *p = (u8 const *)buf;
while (--len >= 0) {
u32 c = crc ^ *p++;
crc = t[c & 15] ^ t[(c >> 4 & 15) + 16] ^ crc >> 8;
}
return crc;
}
Здесь расчёт потетрадный, соответственно - таблица намного короче. С IAR-ом спаривается так:
Полином - тот же самый, что у Вас, просто повернутый битами в обратную сторону. Чтобы работала ваша функция, наверное нужно в настройках (выше) порядок бит/байт поменять. Но (имхо) - потетрадная таблица лучше.
if (~CRC32(__checksum_begin, __checksum_end - __checksum_begin + 1, 0xDEBB20E3) != __checksum) trap(TRAP_PRG_IMAGE);
где: содержимое __checksum генерит IAR_ARM_7.80.4 самостоятельно.