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