Цитата(skripach @ Apr 11 2008, 01:59)

В архиве моя функция по расчету CRC7
Я пошел дальше.
По скольку работаю с ARM, памяти немеряно, решил сделать табличный вариант.
Таблица генерится в RAM при запуске, далее по определению.
!!
!!
Скорость общения с картой поднялась на порядок!
Код
#define CRC7_POLYNOMIAL 0x89 /* x^7 + x^3 + 1 */
static unsigned char crc7_syndrome_table[256];
void gen_crc7_syndrome_table (void) {
int i, j, syndrome;
for (i = 0; i < 256; ++i) {
syndrome = ((i & 0x80) != 0)? i ^ CRC7_POLYNOMIAL : i;
for (j = 0; j < 7; ++j)
if (((syndrome <<= 1) & 0x80) != 0) syndrome ^= CRC7_POLYNOMIAL;
crc7_syndrome_table[i] = (unsigned char) syndrome;
}
}
char crc7 (const unsigned char *ptr) {
unsigned char i, crc7_accum = 0;
for (i = 0; i < 5; ++i) // 6 - адаптировано для SD
crc7_accum = crc7_syndrome_table[(crc7_accum << 1) ^ *ptr++];
return ((crc7_accum<<1)|1); // адаптировано для SD (+ стоп бит)
}