Jump to content

    
Sign in to follow this  
prottoss

IAR 7.30 подсчет CRC прошивки

Recommended Posts

Доброго времени суток и с наступающим Новым Годом!

 

Решил сделать CRC для приложения в STM32F107.

Зашел в настройки линкера.

На вкладке Checksum, выставил все опции, как мне нужно, для подсчета CRC.

Во вкладке линкера Config указал свой файл *.icf.

 

ICF выглядит вот так

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__   = 0x08001000;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x2000BFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x1000;
define symbol __ICFEDIT_size_heap__   = 0x1000;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };
                        
place at address mem:__ICFEDIT_region_ROM_end__-2 { readonly section .checksum };

 

В проекте объявляю переменную:

#pragma section=".checksum"

const UINT16 __checksum;

 

Линкер ругается вот так:

Error[Li006]: duplicate definitions for "__checksum"; in "D:\prottoss\Sources\stm32_boot_test\app_prj\Debug\Obj\app.o", and "Place holder __checksum"

 

 

Если объявляю, как внешней:

#pragma section=".checksum"

extern const UINT16 __checksum;

 

То линкер ругается вот так:

ielftool error: The string '__checksum' was not found in the string table

Error while running ielftool "--fill" "0xFF;0x0-0xfffd" "--checksum" "__checksum:2,crc16,0x0;0x0-0xfffd" "--verbose" "D:\prottoss\Sources\stm32_boot_test\app_prj\Debug\Exe\stm32_app.out.tmp" "D:\prottoss\

Sources\stm32_boot_test\app_prj\Debug\Exe\stm32_app.out"

 

Подскажите, что я делаю не так? Или чего не догоняю?

Спасибо!

 

Share this post


Link to post
Share on other sites

С Новым Годом!

 

Объявляю вот так:

extern uint32_t __checksum;

 

ICF выглядит вот так

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__	 = 0x08001000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08001000;
define symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FB;
define symbol __checksum_start__		  = 0x0800F7FC;
define symbol __EEPROM1_start__ 	   	  = 0x0800F800;
define symbol __EEPROM1_end__   	   	  = 0x0800FBFF;
define symbol __EEPROM2_start__ 		  = 0x0800FC00;
define symbol __EEPROM2_end__   		  = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__	  = 0x400;
define symbol __ICFEDIT_size_heap__		= 0x000;
/**** End of ICF editor section. ###ICF###*/


define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define block CSTACK	with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP	  with alignment = 8, size = __ICFEDIT_size_heap__	 { };

define symbol EEPROM1_Size   	= __EEPROM1_end__ - __EEPROM1_start__ + 1;
define symbol EEPROM2_Size   	= __EEPROM2_end__ - __EEPROM2_start__ + 1;
define symbol EEPROM1_Start   	= __EEPROM1_start__;
define symbol EEPROM2_Start   	= __EEPROM2_start__;
define region EEPROM1_region	 = mem:[from __EEPROM1_start__ to __EEPROM1_end__];
define region EEPROM2_region	 = mem:[from __EEPROM2_start__ to __EEPROM2_end__];
define symbol APP_Start   	= __ICFEDIT_region_ROM_start__;
define symbol INTVEC_Start   	= __ICFEDIT_intvec_start__;

/* Export of symbol */
export symbol EEPROM1_Size;
export symbol EEPROM2_Size;
export symbol EEPROM1_Start;
export symbol EEPROM2_Start;
export symbol APP_Start;
export symbol INTVEC_Start;

initialize by copy { readwrite };
//initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application
do not initialize  { section .noinit };
do not initialize  { section EEPROM1 };
do not initialize  { section EEPROM2 };

place at address mem:__ICFEDIT_intvec_start__ 	{ readonly section .intvec };
place at address mem:__checksum_start__	   	{ readonly section .checksum };
place in ROM_region	 				{ readonly };
place in RAM_region	 				{ readwrite, block CSTACK, block HEAP };
place in EEPROM1_region 				{ readwrite data section EEPROM1 };
place in EEPROM2_region 				{ readwrite data section EEPROM2 };

 

В настройках линкера на закладке Extra options:

--keep __checksum

 

Закладка Checksum выглядит вот так:

2016_01_01_11_19_09.jpg

Edited by IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Share this post


Link to post
Share on other sites
С Новым Годом!
Спасибо! Вас тоже.

Нашел тему http://electronix.ru/forum/index.php?showtopic=73413

У меня все так же - нужно было просто куда нибудь прочитать переменную. Тогда все собралось без ошибок. Переменную __checksum объявляю как внешнюю.

Теперь проблема в другом. ELF-файл (он же *.out) генерится без проблем и IAR IDE его заливает в МК. Но сделать нормальный *.bin не получается.

В опции проекта "Output Converter" ставлю галку на "Generate additional output". Выбираю "Binary". При компиляции генерится бинарник размером 134 мегабайта! Если выключаю в линкере все опции, связанные с контрольной суммой то бинарник создается с размером, соответствующем размеру прошивки.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this