Jump to content

    
Sign in to follow this  
kostya-m

Линкер и засовывание функций в ITCMRAM (STM32F7xx)

Recommended Posts

Исходя из непонятных соображений, линкер считает что процедуру, отмеченную секцией ITCMRAM надо считать RO, а в другом случае RW. Причем это может проявляться даже в рамках одного исходного файла на С.

например

void Data_StartNextTransfer( void ) @ ".itcmram"
{..................}

При компиляции ошибок нет. Мало того, если посмотреть асемблерный листинг, то и там в заголовке указания на секции совпадают

Однако линкер может выдать такое сообщение

Warning[Lp005]: placement includes a mix of sections with content (example "ro code section .itcmram in USBH.o") and sections without content  D:\WORK\C\ARM\PA-20 v4 new\EWARM\stm32f745xx_flash_sram.icf 54 
(example "rw code section .itcmram in DataTask.o symbols: [Data_StartNextTransfer]") 
Warning[Lp006]: placement includes a mix of writable sections (example "rw code section .itcmram in DataTask.o symbols: [Data_StartNextTransfer]")  D:\WORK\C\ARM\PA-20 v4 new\EWARM\stm32f745xx_flash_sram.icf 54 
and non-writable sections (example "ro code section .itcmram in USBH.o")

а в мэп файле хорошо видно, что те функции, которые он нормально кладет в ITCMRAM, помечены как RW. Те, что в том же исходнике, но оставленные в ПЗУ - CODE. Но те, что он отказывается класть в ITCMRAM помечает как RO. И хотя сообщение - предупреждение, реально прошивка не работает. По всяким атрибутам функций закономерности не заметил. Подскажите, что в функции может быть не так и как это исправить, если я ее хочу запускать из ITCMRAM?

/*###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__       = 0x080FFFFF;
define symbol __ICFEDIT_region_DTCMRAM_start__     = 0x20000000;
define symbol __ICFEDIT_region_DTCMRAM_end__       = 0x2000FFFF;
define symbol __ICFEDIT_region_SRAM1_start__     = 0x20010000;
define symbol __ICFEDIT_region_SRAM1_end__       = 0x2004BFFF;
define symbol __ICFEDIT_region_SRAM2_start__     = 0x2004C000;
define symbol __ICFEDIT_region_SRAM2_end__       = 0x2004FFFF;
define symbol __ICFEDIT_region_ITCMRAM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ITCMRAM_end__   = 0x00003FFF;
define symbol __ICFEDIT_region_SRAM_start__    = 0x60000000;
define symbol __ICFEDIT_region_SRAM_end__      = 0x601FFFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__ = 0x200;
/**** 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 DTCMRAM_region  = mem:[from __ICFEDIT_region_DTCMRAM_start__   to __ICFEDIT_region_DTCMRAM_end__];
define region SRAM1_region    = mem:[from __ICFEDIT_region_SRAM1_start__   to __ICFEDIT_region_SRAM1_end__];
define region SRAM2_region    = mem:[from __ICFEDIT_region_SRAM2_start__   to __ICFEDIT_region_SRAM2_end__];
define region SRAM_region     = mem:[from __ICFEDIT_region_SRAM_start__   to __ICFEDIT_region_SRAM_end__];
define region ITCMRAM_region  = mem:[from __ICFEDIT_region_ITCMRAM_start__ to __ICFEDIT_region_ITCMRAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
define block SRAM      with alignment = 8 { section .sram };
define block SRAM2     with alignment = 8 { section .sram2 };
define block DTCMRAM   with alignment = 8 { section .dtcmram };
define block ITCMRAM   with alignment = 8 { section .itcmram };

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

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

place in ROM_region     { readonly };
place in SRAM1_region   { readwrite,   
            block HEAP,
                        block CSTACK};
place in SRAM_region    { block SRAM };
place in ITCMRAM_region {block ITCMRAM };
place in DTCMRAM_region {block DTCMRAM };
place in SRAM2_region   {block SRAM2 };

Share this post


Link to post
Share on other sites
__ramfunc void Data_StartNextTransfer( void ) @ ".itcmram" {...}

Только объявленную таким образом функцию нельзя вызывать до си-стартапа.

Попробовал такой префикс. Сообщение осталось, не помогло.

Share this post


Link to post
Share on other sites
А если указать:

place in ITCMRAM_region {readwrite, block ITCMRAM };

Может конечно масло маслянное...

Обругался, что нельзя rw сразу в два региона класть. Основной rw живет в SRAM1

Share this post


Link to post
Share on other sites
Попробовал такой префикс. Сообщение осталось, не помогло.

У меня с таким форматом нормально линкуется.

 

Обругался, что нельзя rw сразу в два региона класть. Основной rw живет в SRAM1

Назначение для всех явно не заданных секций ro и rw лучше помещать в конце icf, а не в начале как у Вас.

А то Вы сперва пишете - "положить все rw-секции в такую-то область", а после вдруг пишете "положить такую-то RW-секцию в такую-то область". Когда она уже положена предыдущей инструкцией.

 

И вообще - какой-то у вас лес в icf....

Share this post


Link to post
Share on other sites

Вполне допускаю, что у меня лес. До сих пор мне приходилось только вписывать секции внешней SRAM, а тут кучка внутренней памяти :)

 

Однако, перенос строк в конец ни чего не дал. Ругань идет на конкретные данные, например.

Error[Lc037]: ambiguous section match: "zi section .bss in ADC.o symbols: [ADCCurrentLimits, ADC_Flags]" matches more than one pattern

 

Попытка указать явно

place in ITCMRAM_region {readonly section .itcmram, readwrite section .itcmram };

Успеха не принесли, сохраняется ошибка из первого поста.

 

Share this post


Link to post
Share on other sites

Вот мой icf для STM32F429:

define memory mem with size = 4G;
define region FLASH_regionA   = mem:[from 0x00004000 to 0x000FFFFF];
define region RAM_regionA     = mem:[from 0x20000000 size 0x3FFE0];
define region RAM_regionB     = mem:[from 0x2003FFE0 size 0x00020];
define region ROM_region      = mem:[from 0x02000000 to 0x02FFFFFF];
define region EEPROM_region   = mem:[from 0x400AF000 size 0x1000];

define block CSTACK with alignment = 8, size = 0x000 {};
define block HEAP   with alignment = 8, size = 0x000 {};

initialize by copy {rw};
initialize by copy {section .textRAM};
do not initialize  {section .noinit};
do not initialize  {section .dma};
do not initialize  {section .ethernet};
do not initialize  {section .bssStk};
do not initialize  {section .bssStkMain};
do not initialize  {section .bssMemNoFill};
do not initialize  {section .imonSave};

define block IMAGE_HEAD with fixed order {section .intvec, section .checksum,
 section .codehead, section .intvecTail, section .codeSignature,
 section .codebegin};
place in RAM_regionB {section .textRAM};
place in FLASH_regionA {ro, first block IMAGE_HEAD, last section .codetail};
place in RAM_regionA {section .BITBAND_RAM, section .dma, section .ethernet};
place in RAM_regionA {rw, first block CSTACK, section .bssMemNoFill,
 block HEAP};

Добавление в этом проекте функции с префиксом __ramfunc в ".textRAM" - всё ок.

Share this post


Link to post
Share on other sites

В том то и дело, что многие функции и у меня нормально залазят туда. Но вот некоторые упираются ногами. И переформатирование Icf файла не помогает. Сообщение как в начале темы сохраняется. В рамках одного исходника на С, могут большинство функций заползать, но некоторые отказываются. Я не смог найти закономерность, что нужно что бы было как надо.

Вот мой icf для STM32F429:

define memory mem with size = 4G;
define region FLASH_regionA   = mem:[from 0x00004000 to 0x000FFFFF];
define region RAM_regionA     = mem:[from 0x20000000 size 0x3FFE0];
define region RAM_regionB     = mem:[from 0x2003FFE0 size 0x00020];
define region ROM_region      = mem:[from 0x02000000 to 0x02FFFFFF];
define region EEPROM_region   = mem:[from 0x400AF000 size 0x1000];

define block CSTACK with alignment = 8, size = 0x000 {};
define block HEAP   with alignment = 8, size = 0x000 {};

initialize by copy {rw};
initialize by copy {section .textRAM};
do not initialize  {section .noinit};
do not initialize  {section .dma};
do not initialize  {section .ethernet};
do not initialize  {section .bssStk};
do not initialize  {section .bssStkMain};
do not initialize  {section .bssMemNoFill};
do not initialize  {section .imonSave};

define block IMAGE_HEAD with fixed order {section .intvec, section .checksum,
 section .codehead, section .intvecTail, section .codeSignature,
 section .codebegin};
place in RAM_regionB {section .textRAM};
place in FLASH_regionA {ro, first block IMAGE_HEAD, last section .codetail};
place in RAM_regionA {section .BITBAND_RAM, section .dma, section .ethernet};
place in RAM_regionA {rw, first block CSTACK, section .bssMemNoFill,
 block HEAP};

Добавление в этом проекте функции с префиксом __ramfunc в ".textRAM" - всё ок.

 

Share this post


Link to post
Share on other sites

Разрешил вопрос. Это все же глюк IAR-а

Перестал использовать указание на секцию

@ ".itcmram"

А только префикс __ramfunc

И добавил в ICF

place in ITCMRAM_region {section .itcmram, section .textrw };

Теперь все функции залазят в ОЗУ

Share this post


Link to post
Share on other sites
Разрешил вопрос. Это все же глюк IAR-а

...

Теперь все функции залазят в ОЗУ

Сомнительно про глюк. Что-то Вы ещё такое в эту .itcmram пихаете о чём не рассказываете. И что не совместимо с остальным содержимым.

Share this post


Link to post
Share on other sites
Сомнительно про глюк. Что-то Вы ещё такое в эту .itcmram пихаете о чём не рассказываете. И что не совместимо с остальным содержимым.

Кроме функций я туда ничего не пихаю. Однако, пришлось отказаться от этого названия, при дефолтном названии .textrw такого не происходит.

Share this post


Link to post
Share on other sites
Кроме функций я туда ничего не пихаю. Однако, пришлось отказаться от этого названия, при дефолтном названии .textrw такого не происходит.

Можно сделать поиск по map-файлу всех вхождений данного имени.

Share this post


Link to post
Share on other sites
Можно сделать поиск по map-файлу всех вхождений данного имени.

Искал. Кроме нескольких указанных функций никого не было. Но это уже неактуально, перешел на дефолтные название. Там не может какой-либо особенности по использованию точки в начале названия секции? Без точки работает.

Share this post


Link to post
Share on other sites
Там не может какой-либо особенности по использованию точки в начале названия секции? Без точки работает.

Точка - часть имени. Без неё - другое имя. А у Вас что-то перекрывается с тем именем.

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