реклама на сайте
подробности

 
 
> Вычислить CRC кода
d7d1cd
сообщение Apr 25 2016, 11:45
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Здравствуйте все. Мне необходимо, чтобы 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?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 14:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01359 секунд с 7
ELECTRONIX ©2004-2016