Здравствуйте!
Использую IAR для AVR версии 6.3.3.1990
МК xmega32D4.
Для написания бутлоадера необходимо подсчитывать CRC прошивки. Хочу это сделать средствами линкера.
Прописываю в настройках:
Рассчитываю программно в соответствии с документацией на линкер IAR
CODE
unsigned long ChecksumStart = 0x0000;
unsigned long ChecksumEnd = 0x8FFD;
...
unsigned short slow_crc16(unsigned short sum, unsigned char *p,unsigned int len)
{
while (len--)
{
int i;
unsigned char byte = *(p++);
for (i = 0; i < 8; ++i)
{
unsigned long osum = sum;
sum <<= 1;
if (byte & 0x80)
sum |= 1;
if (osum & 0x8000)
sum ^= 0x1021;
byte <<= 1;
}
}
return sum;
}
...
unsigned short calc = 0;
// Run the checksum algorithm
calc = slow_crc16(0, (unsigned char *) ChecksumStart,(ChecksumEnd - ChecksumStart+1));
// Rotate out the answer
unsigned char zeros[2] = {0, 0};
calc = slow_crc16(calc, zeros, 2);
...
Результат как программного расчета, так и линкером отправляю в com порт. Они не совпадают. И программный расчет не постоянен: при передергивании питания значение меняется.
P.S. Видела подобные проблемы и их обсуждения на форуме, но не поняла, есть ли решение
Сообщение отредактировал Мария Е - Jun 18 2013, 11:16
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!