|
|
  |
программный доступ к значениям из icf файла, IAR ARM |
|
|
|
Mar 26 2012, 06:35
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553

|
Для армов смотри в сторону __segment_begin __segment_end
|
|
|
|
|
Mar 26 2012, 07:00
|

Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328

|
Цитата(Сергей Борщ @ Mar 26 2012, 12:47)  По аналогии с другими компиляторами/линкерами - extern uint32_t ROM_start[]; не проходит? Нет, пишет "constant value is not known" Цитата(shmur @ Mar 26 2012, 13:35)  Для армов смотри в сторону __segment_begin __segment_end Смотрю, но не понимаю какое имя надо подставить в качестве аргумента для __section_begin например. Вот мой icf файл: CODE /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08003000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08003000 ; define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x20004FFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x400; define symbol __ICFEDIT_size_heap__ = 0x00; /**** 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 RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define symbol __region_USB_PKG_RAM_start__ = 0x40006000; define symbol __region_USB_PKG_RAM_end__ = 0x400063FF; define region USB_PKG_RAM_region = mem:[from __region_USB_PKG_RAM_start__ to __region_USB_PKG_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite }; do not initialize { section .noinit }; do not initialize { section USB_PACKET_MEMORY };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in USB_PKG_RAM_region { readwrite data section USB_PACKET_MEMORY }; place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP };
какое бы имя я не взял в коде: Код #pragma section="xxx" volatile __no_init uint8_t flash_as_eprom[1024] @ __section_begin("xxx"); рождается секция нулевой длины, которая просто выкидывается. А вообще, мне нужно значение ROM_end
|
|
|
|
|
Mar 26 2012, 12:42
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553

|
С кучей так поступали Код define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; place in RAM_region { readwrite, block CSTACK, block HEAP }; Код #pragma segment="HEAP" ... u32 size = (u32)__segment_size("HEAP"); void* heap_base_pool = (void *)__segment_begin("HEAP"); С ROM не пробовал, для него, наверное, вручную нужно завести секцию или блок, так как по умолчанию там он никак не именован. А вообще почитай в EWARM_DevelopmentGuide главу "The linker configuration file" 381 стр. там все написано. Цитата рождается секция нулевой длины, которая просто выкидывается. Значит не находит такую секцию, там линкер предупреждение должен выдавать  Хотя вру, секция называется ".rodata"
Сообщение отредактировал shmur - Mar 26 2012, 13:00
|
|
|
|
|
Mar 26 2012, 17:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(shmur @ Mar 26 2012, 19:42)  А вообще почитай в EWARM_DevelopmentGuide главу "The linker configuration file" 381 стр. там все написано. Поддерживаю. Написано там много, самое интересное на страницах 400 и 401. Короче, чтобы использовать в своей программе символы объявленные в icf через define symbol нужно их экспортировать директивой export symbol name;Или сразу объявлять директивой define exported symbol name = expr;
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Mar 28 2012, 06:02
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(shreck @ Mar 28 2012, 05:32)  Спасибо, разобрался. Ну так напишите, что нового открыли? Что нужно в хедере их упомянуть, как выше было указано ? Или что-то еще?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Mar 28 2012, 07:01
|

Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328

|
Цитата(Dog Pawlowa @ Mar 28 2012, 13:02)  Ну так напишите, что нового открыли? Что нужно в хедере их упомянуть, как выше было указано ? Или что-то еще? В icf файле делаем export symbol на нужный name, а в программе объявляем его как extern и пользуем. В указанном документе все с примерами описано. shmur и SSerge ткнули в нужное место.
|
|
|
|
|
Jun 7 2012, 02:07
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(_Артём_ @ Jun 5 2012, 13:28)  Думаю, надо смотреть в сторону __segment_end (если такой естьв IAR ARM). Неверно, ибо во флеш в общем случае пишется > одного сегмента. Сначала - надо определить порядок размещения входных сегментов во флеш, в конец пристроить определённый сегмент, его и смотреть. Я делаю так (*.icf): define block IMAGE_HEAD with fixed order { section .intvec, section .checksum, section .imagesize, section .intvecTail }; place in FLASH_region { ro, first block IMAGE_HEAD, last section .codetail };
(говорит - поместить во FLASH_region все readonly сегменты, первым - блок IMAGE_HEAD в котором у меня и сохраняется CRC) В сегменте .codetail определяю одну единственную переменную (*.asm): PUBLIC __codetail SECTION .codetail:CONST:NOROOT(2) __codetail DC32 0xAAAAAAAA
её потом и использую как конец проги (не забывая добавить её в исключения линкёру, чтоб он не выкидывал её из выходного файла). Да - и в IAR есть возможность встроенной генерации CRC, что и использую.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|