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

 
 
 
Reply to this topicStart new topic
> как в IAR зарезервировать место в FLASH? (для eeprom)
avmsystem
сообщение Oct 5 2009, 10:22
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 3-02-05
Пользователь №: 2 399



Есть LPC2103.
Собираюсь сделать эмуляцию eeprom, хочу забить под нее место в 6 и 7 секторах.
Как написать в IAR, чтобы он в этих секторах ничего не размещал?

Вопрос возможно не слишком умный, и чуствую, что разговор идет про линкер, сам пока разобраться не смог, поскольку в линкерах разбираюсь как в танкерах. rolleyes.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 5 2009, 14:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(avmsystem @ Oct 5 2009, 16:22) *
Как написать в IAR, чтобы он в этих секторах ничего не размещал?
Наверное нужно выделить отдельный пользовательский сегмент в icf-файле. Либо объявить неинициализированный константный массив с размером двух секторов и с адреса, совпадающего с началом сектора.
Go to the top of the page
 
+Quote Post
IgorMarx
сообщение Oct 5 2009, 18:33
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268



Именно так. Например, резервируем 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; // объявление переменной



Примерно так (код не тестился, написан на лету)
Go to the top of the page
 
+Quote Post
avmsystem
сообщение Oct 8 2009, 16:47
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 3-02-05
Пользователь №: 2 399



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

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


т.е. ограничить регион ROM? Объявление другого региона, инициализация и объявление массива в программе не требуется?
Go to the top of the page
 
+Quote Post
avmsystem
сообщение Oct 12 2009, 07:45
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 3-02-05
Пользователь №: 2 399



Пытаюсь в 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)


Поскольку в настройки линкера полез первый раз, прошу помочь, как все это сделать правильно.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Oct 12 2009, 09:42
Сообщение #6


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Вот так

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


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

Код
place in MY_region   { .MY_section}
Go to the top of the page
 
+Quote Post
avmsystem
сообщение Oct 16 2009, 06:39
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 3-02-05
Пользователь №: 2 399



Может кто-нибудь все таки ответит на два вопроса!!! help.gif

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

2. Как понять несоответствие адресов в ICF и datasheet касаемо RAM ?
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 11 2009, 14:34
Сообщение #8


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(avmsystem @ Oct 16 2009, 09:39) *
1. Можно ли просто ограничить в линкере регион ROM ?

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

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

Вы выложите свой icf файл
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 11 2009, 23:20
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
Далее создаете свою секцию и располагаете ее в этом регионе
Код
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 (если задан).
Go to the top of the page
 
+Quote Post
avmsystem
сообщение Nov 13 2009, 09:48
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 3-02-05
Пользователь №: 2 399



Цитата(KRS @ Nov 11 2009, 17:34) *
1 - можно!
2 - должно быть, как в datatsheet

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


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

Прикрепленный файл  prj43.rar ( 664 байт ) Кол-во скачиваний: 116
Go to the top of the page
 
+Quote Post
avmsystem
сообщение Dec 17 2009, 11:57
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 3-02-05
Пользователь №: 2 399



Продолжаю искать ответ, пока безуспешно.
Go to the top of the page
 
+Quote Post
vmp
сообщение Dec 17 2009, 13:46
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Цитата(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.

Так что урезайте аппетиты программы.
Go to the top of the page
 
+Quote Post
avmsystem
сообщение Dec 18 2009, 11:55
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 3-02-05
Пользователь №: 2 399



Цитата(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:
Прикрепленное изображение


Объясните пожалуйста кто понимает.
Go to the top of the page
 
+Quote Post
vmp
сообщение Dec 18 2009, 12:48
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Адреса соответствуют даташиту. Надо уменьшить требования к резервированию ОЗУ. Если вы не используете кучу (функции alloc млм оператор new), то можно поставить
define symbol __ICFEDIT_size_heap__ = 0;
Аналогично для стека поставить размер поменьше (смотрите, чтобы он не переполнился).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:18
Рейтинг@Mail.ru


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