Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как в IAR зарезервировать место в FLASH? (для eeprom)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
avmsystem
Есть LPC2103.
Собираюсь сделать эмуляцию eeprom, хочу забить под нее место в 6 и 7 секторах.
Как написать в IAR, чтобы он в этих секторах ничего не размещал?

Вопрос возможно не слишком умный, и чуствую, что разговор идет про линкер, сам пока разобраться не смог, поскольку в линкерах разбираюсь как в танкерах. rolleyes.gif
rezident
Цитата(avmsystem @ Oct 5 2009, 16:22) *
Как написать в IAR, чтобы он в этих секторах ничего не размещал?
Наверное нужно выделить отдельный пользовательский сегмент в icf-файле. Либо объявить неинициализированный константный массив с размером двух секторов и с адреса, совпадающего с началом сектора.
IgorMarx
Именно так. Например, резервируем 7-й сектор:


Код
...
define symbol __ICFEDIT_region_ROM_end__   = 0x00006FFF; // Уменьшите здесь адрес так, чтобы не налезал на резервируемые сектора
...
define region SETTINGS_region    = mem:[from 0x00007000 to 0x00007FFF];
place in SETTINGS_region {readonly section SETTINGS};
do not initialize  { section SETTINGS};
...


В Вашей программе на Си:

Код
#define SETTINGS    _Pragma("location=\"SETTINGS\"")
...
SETTINGS const int some_var; // объявление переменной



Примерно так (код не тестился, написан на лету)
avmsystem
Правильно ли я понял, что поскольку собираюсь работать с данными секторами по абсолютным адресам,
то в ICF достаточно будет подправить только первую строку,

Цитата(IgorMarx @ Oct 5 2009, 22:33) *
Код
define symbol __ICFEDIT_region_ROM_end__   = 0x00006FFF; // Уменьшите здесь адрес так, чтобы не налезал на резервируемые сектора


т.е. ограничить регион ROM? Объявление другого региона, инициализация и объявление массива в программе не требуется?
avmsystem
Пытаюсь в LPC2103 зарезервировать 6 и 7 сектора flash для эмуляции eeprom.
Поскольку обращаться к eeprom собираюсь по абсолютным адресам, то видимо самый простой способ, просто ограничить в линкере регион ROM типа:
Код
define symbol __ICFEDIT_region_ROM_end__     = 0x5FFF;

Поправьте пожалуйста, если неправильно.

И второй вопрос, обратил внимание, что по умолчанию в ICF написано ICFEDIT_region_RAM_start__ = 0x100000,
хотя в datasheet начало RAM с 0x4000 0000. Исправил эти RAMовские адреса, после чего IAR послал меня со словами:
Код
Error[Lp011]: section placement failed: unable to allocate space for sections/blocks with a total estimated minimum size of 0x235b bytes in <[0x40000000-0x40001fff]> (total  uncommitted space 0x2000).
          Needed:             [0x40000000-0x40001fff]: 0x2358 minimum (size: 0x2000)


Поскольку в настройки линкера полез первый раз, прошу помочь, как все это сделать правильно.
MALLOY2
Вот так

Код
define region MY_region   = mem:[from 0x...  to  0x...];


Далее создаете свою секцию и располагаете ее в этом регионе

Код
place in MY_region   { .MY_section}
avmsystem
Может кто-нибудь все таки ответит на два вопроса!!! help.gif

1. Можно ли просто ограничить в линкере регион ROM ?

2. Как понять несоответствие адресов в ICF и datasheet касаемо RAM ?
KRS
Цитата(avmsystem @ Oct 16 2009, 09:39) *
1. Можно ли просто ограничить в линкере регион ROM ?

2. Как понять несоответствие адресов в ICF и datasheet касаемо RAM ?

1 - можно!
2 - должно быть, как в datatsheet

Вы выложите свой icf файл
defunct
Цитата
Далее создаете свою секцию и располагаете ее в этом регионе
Код
place in MY_region { .MY_section}

Все-таки, какой убогий этот IAR... в сравнении RVDS'ом..
В RVDS все тело-движения свелись бы к одной секции в scatter файле:

Код
Eeprom_region 0x7000 0x1000
{
          eeprom_data.o (+RW, +ZI); <- опционально объекник(и) который(ые) надо положить в объявляемый регион
          eeprom_code.o (+RO)
}


Если ни один объектник класть туда не нужно, тогда в C файлах просто пользуем как extern символы линкера описывающие секции этого региона.
Image$$Eeprom_region$$xx$$Length
Image$$Eeprom_region$$xx$$Base

на месте xx - тип данных RO, RW, ZI (если задан).
avmsystem
Цитата(KRS @ Nov 11 2009, 17:34) *
1 - можно!
2 - должно быть, как в datatsheet

Вы выложите свой icf файл


Выкладываю icf.
ROM ограничил до 6го сектора.
RAM указал как в datasheet.
IAR не согласен rolleyes.gif

Нажмите для просмотра прикрепленного файла
avmsystem
Продолжаю искать ответ, пока безуспешно.
vmp
Цитата(avmsystem @ Dec 17 2009, 14:57) *
Продолжаю искать ответ, пока безуспешно.

Вы пытаетесь впихнуть как минимум 0x8000 байт в 0x2000.
Не удивительно, что у вас ничего не выходит.

Для RAM вы отводите 0x2000 байт:
define symbol __ICFEDIT_region_RAM_start__ = 0x40000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x40001FFF;
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];

В нее вы хотите положить среди всего прочего блок HEAP:
place in RAM_region { readwrite,
block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK,
block UND_STACK, block ABT_STACK, block HEAP };
размером 0x8000 байт:
define symbol __ICFEDIT_size_heap__ = 0x8000;
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };

Это не считая CSTACK размером 0x2000.

Так что урезайте аппетиты программы.
avmsystem
Цитата(vmp @ Dec 17 2009, 16:46) *
Вы пытаетесь впихнуть как минимум 0x8000 байт в 0x2000.
Не удивительно, что у вас ничего не выходит.


Спасибо за совет.
Но понимание пока не пришло.
То что я пытаюсь впихнуть больше чем отвожу, понятно. Дело в том, что за основу был взят ICF по умолчанию(c которым IAR работает без проблем), в котором я исправил только RAM и ROM регионы, причем ROM ограничил именно для резервирования под eeprom.
А вот RAM исправил взяв данные из datasheet по совету KRS.
Видно , что проблема с адресами RAM, но их соответствие с datasheet не понимаю.

Кусок generic.icf:
Код
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__   = 0x80;
define symbol __ICFEDIT_region_ROM_end__     = 0x7FFFF;
define symbol __ICFEDIT_region_RAM_start__   = 0x100000;
define symbol __ICFEDIT_region_RAM_end__     = 0x1FFFFF;


Кусок моего icf:
Код
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x0;
define symbol __ICFEDIT_region_ROM_end__   = 0x5FFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x40000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x40001FFF;



Memory Map: Нажмите для просмотра прикрепленного файла

Объясните пожалуйста кто понимает.
vmp
Адреса соответствуют даташиту. Надо уменьшить требования к резервированию ОЗУ. Если вы не используете кучу (функции alloc млм оператор new), то можно поставить
define symbol __ICFEDIT_size_heap__ = 0;
Аналогично для стека поставить размер поменьше (смотрите, чтобы он не переполнился).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.