Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: программный доступ к значениям из icf файла
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
shreck
Есть ли возможность программно получить доступ к значениям, определенным в icf файле?
Типа ROM_start, ROM_end, cstack и т.д.
Сергей Борщ
QUOTE (shreck @ Mar 26 2012, 06:07) *
доступ к значениям, определенным в icf файле?
По аналогии с другими компиляторами/линкерами - extern uint32_t ROM_start[]; не проходит?
shmur
Для армов смотри в сторону __segment_begin __segment_end
shreck
Цитата(Сергей Борщ @ 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
shmur
С кучей так поступали
Код
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 стр. там все написано.

Цитата
рождается секция нулевой длины, которая просто выкидывается.

Значит не находит такую секцию, там линкер предупреждение должен выдаватьsm.gif

Хотя вру, секция называется ".rodata"
SSerge
Цитата(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;
shreck
Спасибо, разобрался.
Dog Pawlowa
Цитата(shreck @ Mar 28 2012, 05:32) *
Спасибо, разобрался.

Ну так напишите, что нового открыли?
Что нужно в хедере их упомянуть, как выше было указано ?
Или что-то еще?
shreck
Цитата(Dog Pawlowa @ Mar 28 2012, 13:02) *
Ну так напишите, что нового открыли?
Что нужно в хедере их упомянуть, как выше было указано ?
Или что-то еще?

В icf файле делаем export symbol на нужный name, а в программе объявляем его как extern и пользуем.
В указанном документе все с примерами описано. shmur и SSerge ткнули в нужное место.
_3m
Напишу сюда чтобы темы не плодить.

iаr еwb fоr аrм v6 ЗО
Как получить от линкера адрес последней занятой ячейки в области флэш памяти (или размер прошивки)?
Хочу его хранить вместе с crc по определенному адресу для облегчения действий в бутлоадере.
_Артём_
Цитата(_3m @ Jun 5 2012, 10:07) *
Напишу сюда чтобы темы не плодить.

iаr еwb fоr аrм v6 ЗО
Как получить от линкера адрес последней занятой ячейки в области флэш памяти (или размер прошивки)?
Хочу его хранить вместе с crc по определенному адресу для облегчения действий в бутлоадере.



Думаю, надо смотреть в сторону __segment_end (если такой естьв IAR ARM).
jcxz
Цитата(_Артём_ @ 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, что и использую.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.