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

 
 
 
Reply to this topicStart new topic
> Почему линкер не распределяет код класса автоматом в свободном банке флеша?, SAM3U4 Iar 6.30
kostyan
сообщение Jul 16 2012, 06:10
Сообщение #1


Частый гость
**

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



Народ, столкнулся с такой проблемой. Проц SAM3U4. Там два банка флэша. Icf файл у меня такой:

CODE

/*###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 файл "неправильный" или опции линкера какието особые есть на такой случай?

Сообщение отредактировал IgorKossak - Jul 18 2012, 20:55
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 17 2012, 07:19
Сообщение #2


Гуру
******

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



Судя по *.icf вы первый регион флеш вообще не используете (только вектора прерываний туда разместили).
Допишите строку:
place in ROM1_region {ro, first section .intvec};
А строку:
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
вообще удалите.
Go to the top of the page
 
+Quote Post
kostyan
сообщение Jul 17 2012, 07:48
Сообщение #3


Частый гость
**

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



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

Код
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"

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

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

Сообщение отредактировал IgorKossak - Jul 17 2012, 08:15
Причина редактирования: [code]для короткого кода!!!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 18 2012, 09:19
Сообщение #4


Гуру
******

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



Цитата(kostyan @ Jul 17 2012, 13:48) *
Первый регион флэша активно используется:
Код
define region ROM2_region  = mem:[from __ICFEDIT_region_ROM0_start__ to __ICFEDIT_region_ROM0_end__]
То что Вы написали - это определение региона, а не использование. Размещение секций кода-данных производится директивами "place ...".
Цитата(kostyan @ Jul 17 2012, 13:48) *
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.
Go to the top of the page
 
+Quote Post
kostyan
сообщение Jul 18 2012, 15:24
Сообщение #5


Частый гость
**

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



Цитата(jcxz @ Jul 18 2012, 15:19) *
То что Вы написали - это определение региона, а не использование. Размещение секций кода-данных производится директивами "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 };
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 23:29
Рейтинг@Mail.ru


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