Перейти к содержанию
    

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

Исходя из непонятных соображений, линкер считает что процедуру, отмеченную секцией 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 };

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если указать:

place in ITCMRAM_region {readwrite, block ITCMRAM };

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если указать:

place in ITCMRAM_region {readwrite, block ITCMRAM };

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вполне допускаю, что у меня лес. До сих пор мне приходилось только вписывать секции внешней 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 };

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот мой 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" - всё ок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В том то и дело, что многие функции и у меня нормально залазят туда. Но вот некоторые упираются ногами. И переформатирование 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" - всё ок.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

@ ".itcmram"

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

И добавил в ICF

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

...

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там не может какой-либо особенности по использованию точки в начале названия секции? Без точки работает.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...