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

 
 
> Error[Lc003]: IAR for ARM, попытка посчитать CRC
Мария Е
сообщение Oct 1 2014, 14:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 18-11-07
Из: Москва
Пользователь №: 32 424



Всем привет!

И снова у меня проблемы с crc. Теперь с IAR ARM.
Пыталась двумя способами: через меню линкера и через файл линкера.
Через меню: не сходится с программным расчетом.
Что пробовала: разные алгоритмы: CRC16, CRC32 и разные настройки (Reverse, initial value и т.д.)
Код для программного расчета брала из EWARM IAR C/C++ Development Guide
Что непонятно: как указывать диапазон адресов из которых вычисляется CRC? (есть подозрение, что это несовпадение связано именно с несовпадением диапазонов данных, которые считаются) Совпадает ли он с диапазоном для Fill unused code memory? А если нет, то как его настроить, чтобы вычислялся только по коду, а не по пустому месту?
Через файл icf: постоянно возникает ошибка Error[Lc003]: expected "check", "define", "do", "export", "if", "include", "initialize", "keep", "place", or a placement label, D:\IAR_projects\ARM\concentrator_RE013_M0+\samd20g16_flash.icf 78
В icf файле определяю блок CHECKSUM, и пишу следующее из EWARM IAR C/C++ Development Guide
ielftool --fill=0xdd; 0x00000000 – 0x00010000;
--checksum=__checksum:2,crc16;0x00000000 – 0x00010000 concentrator_RE013_M0+.out.temp concentrator_RE013_M0+.out.
Пробовала просто fill, та же ошибка. Гуглила, не помогло(((
Что я делаю не так? crying.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Oct 2 2014, 16:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



А какой у Вас IAR (версия)? В разных версиях немного разные настройки.
У меня в проектах на IAR6.50 так (и см. скриншоты):
Прикрепленное изображение

Прикрепленное изображение

Для IAR5.50 первый скриншот будет немного другим (всё остальное - так же).
Соответствущий расчёт CRC:
CODE
//Расчёт CRC32 полином == 0xEDB88320L
u32 CRC32(void const *buf, int len, u32 crc)
{
static const u32 t[] = {
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x00000000, 0x1DB71064, 0x3B6E20C8, 0x26D930AC,
0x76DC4190, 0x6B6B51F4, 0x4DB26158, 0x5005713C,
0xEDB88320, 0xF00F9344, 0xD6D6A3E8, 0xCB61B38C,
0x9B64C2B0, 0x86D3D2D4, 0xA00AE278, 0xBDBDF21C};

u8 const *p = (u8 const *)buf;
while (--len >= 0) {
u32 c = crc ^ *p++;
crc = t[c & 15] ^ t[(c >> 4 & 15) + 16] ^ crc >> 8;
}
return crc;
}

static u32 crch;

//Программная эмуляция аппаратного вычислителя CRC
u32 HCRC32(void const *data, int len)
{
return ~(crch = CRC32(data, len, crch));
}

void InitPrgCRC() { crch = 0; }

В LPC177x/8x возможно задействовать аппаратный вычислитель CRC.
У меня в проектах он используется, но здесь я его вырезал, оставил только ту часть дефайна, которая для случая отсутствия аппаратного вычислителя.

Вызов (в начале main()):
CODE
...
//проверка, что весь образ ПО во FLASH защищён CRC в IAR
if ((u8 *)&__codetail[ncell(__codetail)] - (u8 *)__vector_table >
__checksum_end + 1 - __checksum_begin + 32 + 4) trap(TRAP_PRG_IMAGE);
InitPrgCRC();
u32 const seed = ~0;
HCRC32(&seed, sizeof(seed));
if (HCRC32(__checksum_begin, __checksum_end - __checksum_begin + 1) !=
__checksum) trap(TRAP_PRG_IMAGE);
...

Участок .icf, описывающий флешь (защищённую CRC):
Код
...
define block IMAGE_HEAD with fixed order {section .intvec, section .checksum,
  section .codehead, section .intvecTail, section .icc_signature};
place in FLASH_region {ro, first block IMAGE_HEAD, last section .codetail};
...

В хидерах определено:
Код
extern "C" vct const __vector_table[];
extern "C" u8 const __checksum_begin[];
extern "C" u8 const __checksum_end[];
extern "C" u32 const __checksum;
extern "C" u32 const __codetail[1];

В asm-файле:
CODE
...
PUBLIC __codetail
EXTERN __checksum_begin, __checksum_end
SECTION .codetail:CONST:NOROOT(2)
__codetail DC32 __checksum_begin
DC32 __checksum_end
DC32 FIRMWARE_TARGET

PUBLIC __codehead
SECTION .codehead:CONST:NOROOT(2)
__codehead DC32 __codetail
DC32 0
...


CRC покрывает весь образ прошивки во флеш, за исключением первых векторов таблицы прерываний.
Для них IAR считает контрольную сумму и с этим у меня возникли конфликты. Так что первые вектора я исключил из расчёта CRC.
Как видите - образ прошивки начинается с адреса 0x1000 (первой идёт секция с векторами прерываний).
Конечный адрес заполнения (первый скриншот) задаёте так, чтобы он покрывал весь образ прошивки с запасом (программа будет расти).
Все дырки заполняются кодом заполнения.

Вот как-то так примерно wink.gif
Go to the top of the page
 
+Quote Post



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

 


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


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