Jump to content

    
Sign in to follow this  
kostyan1

Почему линкер не распределяет код класса автоматом в свободном банке флеша?

Recommended Posts

Народ, столкнулся с такой проблемой. Проц SAM3U4. Там два банка флэша. 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__ = 0x00080000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM0_start__  = 0x00080000;
define symbol __ICFEDIT_region_ROM0_end__	 = 0x0009FFFF; 
define symbol __ICFEDIT_region_ROM1_start__  = 0x00100000;
define symbol __ICFEDIT_region_ROM1_end__	 = 0x0011FFFF; 

define symbol __ICFEDIT_region_RAM1_start__  = 0x20000000;
define symbol __ICFEDIT_region_RAM1_end__    = 0x20008000;
define symbol __ICFEDIT_region_RAM2_start__  = 0x20080000;
define symbol __ICFEDIT_region_RAM2_end__    = 0x20083FFF;
define symbol __ICFEDIT_region_RAM3_start__  = 0x20100000;
define symbol __ICFEDIT_region_RAM3_end__    = 0x20101080;

/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x500; /*0x1000*/
define symbol __ICFEDIT_size_heap__   = 0;
define symbol __ICFEDIT_size_storage__ = 0x4000;/*0x3500; 0x3000*/
define symbol __ICFEDIT_size_nand_storage__ = 0x1080;
/**** End of ICF editor section. ###ICF###*/


define memory mem with size = 4G;
define region ROM0_region   = mem:[from __ICFEDIT_region_ROM0_start__   to __ICFEDIT_region_ROM0_end__];
define region ROM1_region   = mem:[from __ICFEDIT_region_ROM1_start__   to __ICFEDIT_region_ROM1_end__];
define region ROM2_region  = mem:[from __ICFEDIT_region_ROM0_start__ to __ICFEDIT_region_ROM0_end__]
		|mem:[from __ICFEDIT_region_ROM1_start__ to __ICFEDIT_region_ROM1_end__];
define region RAM1_region   = mem:[from __ICFEDIT_region_RAM1_start__   to __ICFEDIT_region_RAM1_end__];
define region RAM2_region   = mem:[from __ICFEDIT_region_RAM2_start__   to __ICFEDIT_region_RAM2_end__];
define region RAM3_region   = mem:[from __ICFEDIT_region_RAM3_start__   to __ICFEDIT_region_RAM3_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
define block TempStorage with alignment = 4, size = __ICFEDIT_size_storage__ { };
define block NandStorage with alignment = 4, size = __ICFEDIT_size_nand_storage__ { };

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

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

place in ROM2_region   { readonly };
place in RAM1_region   { readwrite, block CSTACK, block HEAP };
place in RAM2_region   { block TempStorage };
place in RAM3_region   { block NandStorage };

 

Столкнулся с такой проблемой. В определенный момент времени стал получать при компиляции такую радость:

"TApplication.cpp

Tool Internal Error:

Internal Error: [CoreUtil/General]: Access violation (0xc0000005) at 007ADD2E (reading from address 0x0)"

 

Посмотрел мап файл еще компилящегося проекта - там класс TApplication.cpp расположен вконце второго банка флеша.

Дописываю пару строчек кода, размер класса увеличивается и не влазит во флеш. Но размер класса таков,

что запросто может поместиться в первом банке флеша, и места там хватает с лихвой. Два вопроса собственно: какова... и как исправить?

 

Руками размещать код класса по определенному адресу не хочется (я и не знаю как), хотелось бы что бы линкер это дело разруливал!

Временно решил проблему путем максимальной оптимизации по размеру, но это не выход, ибо оптимизация для меня, скажем так, по религиозным причинам не канает впринципе.

 

Может у меня icf файл "неправильный" или опции линкера какието особые есть на такой случай?

Edited by IgorKossak

Share this post


Link to post
Share on other sites

Судя по *.icf вы первый регион флеш вообще не используете (только вектора прерываний туда разместили).

Допишите строку:

place in ROM1_region {ro, first section .intvec};

А строку:

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

вообще удалите.

Share this post


Link to post
Share on other sites

Первый регион флэша активно используется:

 

define region ROM2_region  = mem:[from __ICFEDIT_region_ROM0_start__ to __ICFEDIT_region_ROM0_end__]
                            |mem:[from __ICFEDIT_region_ROM1_start__ to __ICFEDIT_region_ROM1_end__];

 

Плюс мэп файл говорит:

 

" 127 783 bytes of readonly code memory

61 561 bytes of readonly data memory

45 554 bytes of readwrite data memory"

 

После Ваших советов проект перестал компиляться.

 

А сделал как тут уже находил инфу про размещение функции по определенному адресу: разместил один метод класса в первом банке. Поработал, пописал код. Потом убрал "подпорочные" директивы - и вуаля - теперь компилится без первоначальной ошибки! Получилось, что сумел подопнуть линкер вручную :)

Edited by IgorKossak
[code]для короткого кода!!!

Share this post


Link to post
Share on other sites
Первый регион флэша активно используется:

define region ROM2_region  = mem:[from __ICFEDIT_region_ROM0_start__ to __ICFEDIT_region_ROM0_end__]

То что Вы написали - это определение региона, а не использование. Размещение секций кода-данных производится директивами "place ...".

127 783 bytes of readonly code memory

61 561 bytes of readonly data memory

Что-то у вас напутано. Вы же сами пишете:

define symbol __ICFEDIT_region_ROM0_start__  = 0x00080000;
define symbol __ICFEDIT_region_ROM0_end__     = 0x0009FFFF; 
define symbol __ICFEDIT_region_ROM1_start__  = 0x00100000;
define symbol __ICFEDIT_region_ROM1_end__     = 0x0011FFFF;

т.е. - у вас должно быть два региона по 128k.

Share this post


Link to post
Share on other sites
То что Вы написали - это определение региона, а не использование. Размещение секций кода-данных производится директивами "place ...".

 

Что то Вы маленько "не договариваете":

 

define region ROM2_region = mem:[from __ICFEDIT_region_ROM0_start__ to __ICFEDIT_region_ROM0_end__]

|mem:[from __ICFEDIT_region_ROM1_start__ to __ICFEDIT_region_ROM1_end__];

place in ROM2_region { readonly };

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