Здравствуйте все. Мне необходимо, чтобы IAR вычислял циклический избыточный код данных во флеш памяти. И знать как он его вычисляет.
Я зашел в опции проекта на вкладку Checksum. Вкладку заполнил так: установил галку Fill unused code memory, Fill pattern = 0xFF, установил галку Generate checksum, Size = 2 byte, Alignment = 2, установил радиокнопку Crc polynomial = 0xA001, Complement = As is, Bit order = MSB first, Init value = 0xFFFF, Checksum init size = 16-bit. При запуске в симуляторе я увидел, что мой код начинается с адреса 0x1102, а по адресу 0x1100 расположен вычисленный IAR-ом циклический избыточный код. Так же по MAP файлу я определил, что CRC вычисляется с адреса 0x1102 по адрес 0xFFFF (я так понимаю, включительно данные по эти адреса).
В коде сразу происходит вычисление CRC той же области флешь памяти, что и при автоматическом вычислении линкером (то есть с 0x1102 по 0xFFFF). Вычисление происходит так:
Код
char *data = (char*)0x1102; // Адрес начала кода
int size = 0xEEFE; // Размер кода
int crc = 0xFFFF; // Начальное значение CRC
while(size--)
{
crc ^= *data++;
for(int i = 0; i < 8; i++)
if(crc & 1) crc = (crc >> 1) ^ 0xA001;
else crc = crc >> 1;
}
В результате CRC, который вычисляет линкер и CRC, вычисляемый моим кодом не совпадают. Я пробовал менять параметры Complement и Bit order, однако совпадения CRC так и не добился.
Подскажите, каким образом линкер вычисляет CRC?