реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> программный доступ к значениям из icf файла, IAR ARM
shreck
сообщение Mar 26 2012, 03:07
Сообщение #1


Местный
***

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



Есть ли возможность программно получить доступ к значениям, определенным в icf файле?
Типа ROM_start, ROM_end, cstack и т.д.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 26 2012, 05:47
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (shreck @ Mar 26 2012, 06:07) *
доступ к значениям, определенным в icf файле?
По аналогии с другими компиляторами/линкерами - extern uint32_t ROM_start[]; не проходит?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
shmur
сообщение Mar 26 2012, 06:35
Сообщение #3


Участник
*

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



Для армов смотри в сторону __segment_begin __segment_end
Go to the top of the page
 
+Quote Post
shreck
сообщение Mar 26 2012, 07:00
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
shmur
сообщение Mar 26 2012, 12:42
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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 стр. там все написано.

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

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

Хотя вру, секция называется ".rodata"

Сообщение отредактировал shmur - Mar 26 2012, 13:00
Go to the top of the page
 
+Quote Post
SSerge
сообщение Mar 26 2012, 17:03
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
shreck
сообщение Mar 28 2012, 02:32
Сообщение #7


Местный
***

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



Спасибо, разобрался.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Mar 28 2012, 06:02
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(shreck @ Mar 28 2012, 05:32) *
Спасибо, разобрался.

Ну так напишите, что нового открыли?
Что нужно в хедере их упомянуть, как выше было указано ?
Или что-то еще?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
shreck
сообщение Mar 28 2012, 07:01
Сообщение #9


Местный
***

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



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

В icf файле делаем export symbol на нужный name, а в программе объявляем его как extern и пользуем.
В указанном документе все с примерами описано. shmur и SSerge ткнули в нужное место.
Go to the top of the page
 
+Quote Post
_3m
сообщение Jun 5 2012, 07:07
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



Напишу сюда чтобы темы не плодить.

iаr еwb fоr аrм v6 ЗО
Как получить от линкера адрес последней занятой ячейки в области флэш памяти (или размер прошивки)?
Хочу его хранить вместе с crc по определенному адресу для облегчения действий в бутлоадере.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 5 2012, 07:28
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(_3m @ Jun 5 2012, 10:07) *
Напишу сюда чтобы темы не плодить.

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



Думаю, надо смотреть в сторону __segment_end (если такой естьв IAR ARM).
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 7 2012, 02:07
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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, что и использую.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01435 секунд с 7
ELECTRONIX ©2004-2016