kostya-m 0 6 февраля, 2017 Опубликовано 6 февраля, 2017 · Жалоба Исходя из непонятных соображений, линкер считает что процедуру, отмеченную секцией 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 225 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба __ramfunc void Data_StartNextTransfer( void ) @ ".itcmram" {...} Только объявленную таким образом функцию нельзя вызывать до си-стартапа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба __ramfunc void Data_StartNextTransfer( void ) @ ".itcmram" {...} Только объявленную таким образом функцию нельзя вызывать до си-стартапа. Попробовал такой префикс. Сообщение осталось, не помогло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amiller 2 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба А если указать: place in ITCMRAM_region {readwrite, block ITCMRAM }; Может конечно масло маслянное... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба А если указать: place in ITCMRAM_region {readwrite, block ITCMRAM }; Может конечно масло маслянное... Обругался, что нельзя rw сразу в два региона класть. Основной rw живет в SRAM1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 225 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Попробовал такой префикс. Сообщение осталось, не помогло. У меня с таким форматом нормально линкуется. Обругался, что нельзя rw сразу в два региона класть. Основной rw живет в SRAM1 Назначение для всех явно не заданных секций ro и rw лучше помещать в конце icf, а не в начале как у Вас. А то Вы сперва пишете - "положить все rw-секции в такую-то область", а после вдруг пишете "положить такую-то RW-секцию в такую-то область". Когда она уже положена предыдущей инструкцией. И вообще - какой-то у вас лес в icf.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Вполне допускаю, что у меня лес. До сих пор мне приходилось только вписывать секции внешней 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 }; Успеха не принесли, сохраняется ошибка из первого поста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 225 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Вот мой 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" - всё ок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба В том то и дело, что многие функции и у меня нормально залазят туда. Но вот некоторые упираются ногами. И переформатирование 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" - всё ок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Разрешил вопрос. Это все же глюк IAR-а Перестал использовать указание на секцию @ ".itcmram" А только префикс __ramfunc И добавил в ICF place in ITCMRAM_region {section .itcmram, section .textrw }; Теперь все функции залазят в ОЗУ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 225 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Разрешил вопрос. Это все же глюк IAR-а ... Теперь все функции залазят в ОЗУ Сомнительно про глюк. Что-то Вы ещё такое в эту .itcmram пихаете о чём не рассказываете. И что не совместимо с остальным содержимым. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Сомнительно про глюк. Что-то Вы ещё такое в эту .itcmram пихаете о чём не рассказываете. И что не совместимо с остальным содержимым. Кроме функций я туда ничего не пихаю. Однако, пришлось отказаться от этого названия, при дефолтном названии .textrw такого не происходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 225 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Кроме функций я туда ничего не пихаю. Однако, пришлось отказаться от этого названия, при дефолтном названии .textrw такого не происходит. Можно сделать поиск по map-файлу всех вхождений данного имени. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Можно сделать поиск по map-файлу всех вхождений данного имени. Искал. Кроме нескольких указанных функций никого не было. Но это уже неактуально, перешел на дефолтные название. Там не может какой-либо особенности по использованию точки в начале названия секции? Без точки работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 225 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Там не может какой-либо особенности по использованию точки в начале названия секции? Без точки работает. Точка - часть имени. Без неё - другое имя. А у Вас что-то перекрывается с тем именем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться