Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Линкер и засовывание функций в ITCMRAM (STM32F7xx)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Мусатов Константин
Исходя из непонятных соображений, линкер считает что процедуру, отмеченную секцией 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 };
jcxz
__ramfunc void Data_StartNextTransfer( void ) @ ".itcmram" {...}
Только объявленную таким образом функцию нельзя вызывать до си-стартапа.
Мусатов Константин
Цитата(jcxz @ Feb 7 2017, 03:30) *
__ramfunc void Data_StartNextTransfer( void ) @ ".itcmram" {...}
Только объявленную таким образом функцию нельзя вызывать до си-стартапа.

Попробовал такой префикс. Сообщение осталось, не помогло.
amiller
А если указать:
place in ITCMRAM_region {readwrite, block ITCMRAM };
Может конечно масло маслянное...
Мусатов Константин
Цитата(amiller @ Feb 7 2017, 13:48) *
А если указать:
place in ITCMRAM_region {readwrite, block ITCMRAM };
Может конечно масло маслянное...

Обругался, что нельзя rw сразу в два региона класть. Основной rw живет в SRAM1
jcxz
Цитата(Мусатов Константин @ Feb 7 2017, 11:49) *
Попробовал такой префикс. Сообщение осталось, не помогло.

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

Цитата(Мусатов Константин @ Feb 7 2017, 13:15) *
Обругался, что нельзя rw сразу в два региона класть. Основной rw живет в SRAM1

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

И вообще - какой-то у вас лес в icf....
Мусатов Константин
Вполне допускаю, что у меня лес. До сих пор мне приходилось только вписывать секции внешней SRAM, а тут кучка внутренней памяти sm.gif

Однако, перенос строк в конец ни чего не дал. Ругань идет на конкретные данные, например.
Код
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 };

Успеха не принесли, сохраняется ошибка из первого поста.
jcxz
Вот мой icf для STM32F429:
CODE
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" - всё ок.
Мусатов Константин
В том то и дело, что многие функции и у меня нормально залазят туда. Но вот некоторые упираются ногами. И переформатирование Icf файла не помогает. Сообщение как в начале темы сохраняется. В рамках одного исходника на С, могут большинство функций заползать, но некоторые отказываются. Я не смог найти закономерность, что нужно что бы было как надо.
Цитата(jcxz @ Feb 7 2017, 15:35) *
Вот мой icf для STM32F429:
CODE
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" - всё ок.

Мусатов Константин
Разрешил вопрос. Это все же глюк IAR-а
Перестал использовать указание на секцию
Код
@ ".itcmram"

А только префикс __ramfunc
И добавил в ICF
Код
place in ITCMRAM_region {section .itcmram, section .textrw };

Теперь все функции залазят в ОЗУ
jcxz
Цитата(Мусатов Константин @ Feb 7 2017, 17:59) *
Разрешил вопрос. Это все же глюк IAR-а
...
Теперь все функции залазят в ОЗУ

Сомнительно про глюк. Что-то Вы ещё такое в эту .itcmram пихаете о чём не рассказываете. И что не совместимо с остальным содержимым.
Мусатов Константин
Цитата(jcxz @ Feb 8 2017, 00:08) *
Сомнительно про глюк. Что-то Вы ещё такое в эту .itcmram пихаете о чём не рассказываете. И что не совместимо с остальным содержимым.

Кроме функций я туда ничего не пихаю. Однако, пришлось отказаться от этого названия, при дефолтном названии .textrw такого не происходит.
jcxz
Цитата(Мусатов Константин @ Feb 8 2017, 00:26) *
Кроме функций я туда ничего не пихаю. Однако, пришлось отказаться от этого названия, при дефолтном названии .textrw такого не происходит.

Можно сделать поиск по map-файлу всех вхождений данного имени.
Мусатов Константин
Цитата(jcxz @ Feb 8 2017, 01:38) *
Можно сделать поиск по map-файлу всех вхождений данного имени.

Искал. Кроме нескольких указанных функций никого не было. Но это уже неактуально, перешел на дефолтные название. Там не может какой-либо особенности по использованию точки в начале названия секции? Без точки работает.
jcxz
Цитата(Мусатов Константин @ Feb 8 2017, 01:36) *
Там не может какой-либо особенности по использованию точки в начале названия секции? Без точки работает.

Точка - часть имени. Без неё - другое имя. А у Вас что-то перекрывается с тем именем.
Мусатов Константин
Имя, с которым возникала неоднозначность сборки: .itcmram , а имена без точки дают однозначную сборку
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.