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

 
 
> Вычислить 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
 
Start new topic
Ответов (1 - 5)
x893
сообщение Apr 25 2016, 11:56
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



https://www.iar.com/support/tech-notes/gene...ing-with-ilink/
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Apr 26 2016, 05:47
Сообщение #3


Местный
***

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



Цитата(x893 @ Apr 25 2016, 14:56) *

У меня другой МК (семейства MSP430), поэтому я перешел несколько по иной ссылке и скачал пример. Там показано как происходит расчет циклического избыточного кода линкером, программно и аппаратно. Для рассчета программным методом есть 2 функции: табличный расчет (быстрый) и без использования таблицы. При запуске в симуляторе и вычислении ЦИК программным методом по табличному расчету, полученное значение совпадает с ЦИК, вычисленным линкером. Когда же ЦИК определяется без использования таблицы, то он не совпадает со значением, вычисленным линкером.

Повторю свой вопрос: каким образом линкер вычисляет ЦИК? Кто-то может привести алгоритм вычисления ЦИК, чтобы результат совпадал со значением, которое вычисляет линкер?
Go to the top of the page
 
+Quote Post
Baser
сообщение Apr 26 2016, 09:15
Сообщение #4


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(d7d1cd @ Apr 26 2016, 08:47) *
Для рассчета программным методом есть 2 функции: табличный расчет (быстрый) и без использования таблицы. При запуске в симуляторе и вычислении ЦИК программным методом по табличному расчету, полученное значение совпадает с ЦИК, вычисленным линкером. Когда же ЦИК определяется без использования таблицы, то он не совпадает со значением, вычисленным линкером.

Это означает только то, что ваши функции табличного и циклического расчета CRC считают различные контрольные суммы.

При расчете CRC различным может быть:
- начальное значение CRC
- полином
- сдвиг полинома влево или вправо (зеркальный полином)
- пост операция с CRC (инверсия или еще чего-нибудь)
- может еще чего забыл...

И при каждой комбинации получается другой результат.
ИАР может считать почти любую комбинацию из вышеперечисленного.
Комбинация задается ключами в скрипте линкера. RTFM sm.gif

Вот для примера куски из файла .xcl одного проекта для AVR, но сути это не меняет, для MSP430 будет примерно также.
Обратите внимание на ключ -J , он задает тип полинома и метод расчета.
Также есть строки, которые задают область памяти для расчета CRC и куда помещать результат.

Код
/* Code (flash) segments */
....
-D_..X_FLASH_END=1FFFF  /* End of flash memory */
-D_..X_APPFLASH_END=1DFFF    /* End of Applications flash memory */
-D_..X_BOOTLOADER_BASE=1F000 /* Start of BootLoader flash memory */
-DBootVer=1FFF0         /* Start of Bootloader SW Version get function */
-DSerialNo=0x1FFF6      /* Start of Serial Number get function */
......
-Hff
-h(CODE)0-(_..X_APPFLASH_END-2)
-J2,crc16,m,,,,0=(CODE)0-(_..X_APPFLASH_END-4)
.....
/*
* Last 2 bytes of application flash don't use,
* because error in AES Bootloader program create.exe
*/
-Z(CODE)CHECKSUM#(_..X_APPFLASH_END-2)
-Z(CODE)BOOTCODE=_..X_BOOTLOADER_BASE-_..X_FLASH_END

Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Apr 28 2016, 05:12
Сообщение #5


Местный
***

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



Baser, у меня проект, где необходимо вычислять CRC, написан на ассемблере. Как я понимаю, это ничего не меняет и настройку линкера, в части вычисления CRC, нужно производить в xcl-файле? Если я все правильно понял, то подскажите, как настроить линкер так, чтобы он вычислял CRC по такому алгоритму:
Код
//****** ВЫЧИСЛЕНИЕ ЦИКЛИЧЕСКОГО ИЗБЫТОЧНОГО КОДА ПО ПОЛИНОМУ A001 ********************************************************************************
/*       ПАРАМЕТРЫ:
         R13 - начальное значение ЦИК
         R14 - адрес начала обсчитываемого массива байт
         R15 - адрес конца обсчитываемого массива байт (байт по данному адресу не включается в расчет)

         ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ:
         R13 - вычисленное значение ЦИК
*/
CALCULATE_CRC16:                                                // ГЛАВНЫЙ ЦИКЛ РАСЧЕТА ЦИК
     MOV.B   @R14+, R12                                         ; Определяю очередной байт из массива данных
     XOR     R12, R13                                           ; Инвертирую биты значения ЦИК по байту массива данных
     MOV     #8, R12                                            ; Задаю счетчик битов

     CALCULATE_CRC16_ByteLoop:                                   // ЦИКЛ ОБСЧЕТА БАЙТА
     CLRC                                                       ; Очищаю бит переноса
     RRC     R13                                                ; Определяю значение очередного бита байта (сдвиг вправо)
     JNC     CALCULATE_CRC16_ByteLoopExit                       ; Если бит равен 0, то перехожу к декременту счетчика битов
     XOR     #0A001h, R13                                       ; ...иначе инвертирую биты значения ЦИК по полиному 0xA001

     CALCULATE_CRC16_ByteLoopExit:                               // ПРОВЕРКА УСЛОВИЙ ВЫХОДА ИЗ ЦИКЛОВ
     DEC     R12                                                ; Уменьшаю счетчик битов
     JNZ     CALCULATE_CRC16_ByteLoop                           ; Если не все биты обсчитаны, то перехожу к очередному циклу обсчета байта
     CMP     R15, R14                                           ; Если не весь массив данных обсчитан, то...
     JNC     CALCULATE_CRC16                                    ; ...перехожу к очередному циклу определения байта массива
     RET                                                        ; Завершаю работу функции
Go to the top of the page
 
+Quote Post
Baser
сообщение Apr 28 2016, 10:58
Сообщение #6


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(d7d1cd @ Apr 28 2016, 08:12) *
... настройку линкера, в части вычисления CRC, нужно производить в xcl-файле? Если я все правильно понял, то подскажите, как настроить линкер так, чтобы он вычислял CRC по такому алгоритму ...

Основное вам уже подсказали, это RTFM sm.gif
Я с этим разбирался лет 8 назад, так что подробностей не помню.
Могу только направить более точно:

IAR Embedded Workbench IDE User Guide
есть главы
Generate checksum.
THE CHECKSUM CALCULATION.

IAR Linker and Library Tools Reference Guide
есть описание опции -J
Use the -J option to calculate a checksum for all generated raw data bytes...
Go to the top of the page
 
+Quote Post

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

 


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


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