Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не инициализируемая память.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
SasaVitebsk
Честно признаю, читал документацию. Даже сделал книжечки и постоянно в них лажу. Но к данному вопросу не знаю как подойти. Не разобрался по английски. smile.gif Поэтому прошу не отфутболивать к документации, а кратко ответить (если можно).

Пытаюсь к ряду переменных пристегнуть спецификатор __no_init. Но при пристёгивании хотябы к одной, компилятор выдаёт ошибку, что у меня отсутсвует сегмент данных NEAR_N. (Точнее не компилятор а редактор связей)

Error[e16]: Segment NEAR_N (size: 0x8 align: 0) is too long for segment definition. At least 0x8 more bytes needed. The problem occurred while processing the segment placement command "-Z(DATA)NEAR_N=_..X_EXT_NV_BASE:+_..X_EXT_NV_SIZE", where at the moment of placement the available memory ranges were "DATA:21ff--1"

Про данные сегменты я читал, но как его объявить в опциях проекта. Чтобы не создавать файл опций.
Если можно, то с примером пожалуйста. smile.gif
zltigo
Цитата(SasaVitebsk @ Jun 3 2006, 19:23) *
Про данные сегменты я читал, но как его объявить в опциях проекта. Чтобы не создавать файл опций.
Если можно, то с примером пожалуйста. smile.gif

Это не прямо в 'проекте' - это в *.xcl файле - опции линкера. Соответственно смотреть документацию на линкер или прямо по "образу и подобию" остальных сегментов отредактировать файл *.xcl имя которого указано в 'проекте'. Если по каким-то непонятным причинам нехочется редактировать
*.xcl файл, то в IDE опциях линкера есть раздел 'extra options', куда и вписать командную строчку.
Есть и 'wizard' для 'генерации', но думаю, что лучше его нафиг послать ввиду его ничем не прикрытой убогости.

А редактировать придется - в Вашем файле сегмент описан, но его размер X_EXT_NV_SIZE мал.
SasaVitebsk
Я смотрел доку по LINK. И если бы я в ней разобрался, то не стал бы никого беспокоить. smile.gif
Описание опции -Z весьма скудное. Тоесть оно полное, но о таких вещах как _..X_EXT_NV_SIZE там не слова.
По моему глупо что сегмент NEAR_I (размеры и начало) линкер "понимает из проекта", а такой же NEAR_N - нет. В моём понимании, по опции __no_init компилятор должен был бы определить мои переменные в соответствующий сегмент. Соответственно линкер выделить под него место. Глупо выделять его вручную. Не хочу его размещать и привязывать к физическому адресу. А как указать линкеру, чтобы он сам зарезервировал место - не знаю.
Кроме всего попробовал дать команду в 'extra options', - так он гад пишет что не фиг мол два раза сегмент определять.

Можно конечно "извратится" и разместить переменные в каком-то своём сегменте, но по-моему должен быть какой-то прямой путь чтобы решить данную проблему.

.xcl файл я не создавал, а пользуюсь закладками в опциях пакета.

Ещё раз попрошу не отсылайте меня к документации. Ну не могу разобраться! Не может быть чтобы никто до меня данную проблему не решал. Кинте в меня примером строки из extra options или xcl файла. Или объясните ошибки. Буду очень благодарен.
Сергей Борщ
Цитата(SasaVitebsk @ Jun 4 2006, 02:03) *
.xcl файл я не создавал, а пользуюсь закладками в опциях пакета.

Ещё раз попрошу не отсылайте меня к документации. Ну не могу разобраться! Не может быть чтобы никто до меня данную проблему не решал. Кинте в меня примером строки из extra options или xcl файла. Или объясните ошибки. Буду очень благодарен.
Там есть одна засада: в стандартных .xcl почему-то считается, что сегмент NEAR_N лежит во внешней памяти. Например у меги-8 он вообще в .xcl не описан. X_EXT_NV_BASE и X_EXT_NV_SIZE - это переменные через которые оболочка передает содержимое полей Project->General Options->System->External memory configuration для столбца Non-Volatile. Если внешней памяти у вас в проекте нет, то можно просто переписать .xcl добавив сегмент NEAR_N в ту же строчку что и NEAR_Z. Если же внешняя память есть, а данные с __no_init хочется держать во внутренней - то надо объявить свой сегмент и вместе с __no_init использовать размещение данных в указанный сегмент:
Код
__no_init int Abc @ "new_segment";
IgorKossak
Проблема в следующем
Цитата
-Z(DATA)NEAR_N=_..X_EXT_NV_BASE:+_..X_EXT_NV_SIZE

Что такое _..X_EXT_NV_BASE и _..X_EXT_NV_SIZE?
В описании расположения сегментов надо изменить эту строку на
Код
-Z(DATA)NEAR_N=_..X_SRAM_BASE-_..X_SRAM_END

Или добавить сегмент NEAR_N туда же, где и описаны сегменты NEAR_I и NEAR_Z в файле *.xcl (в опциях проекта это, к сожалелению, сделать не получится если имеется определение для сегмента по умолчанию).
SasaVitebsk
Спасибо всем откликнувшимся. smile.gif Перевариваю.
SasaVitebsk
Подключил xcl файл, по образу и подобию "подсмотренному" в MAP файле. Но вот одна проблема

Почему-то не хочет переваривать следующую строку. (В MAP файле эта строка наблюдается)

-s __program_start "C:\IAR Systems\Embedded Workbench 4.0 Evalution\avr\LIB\CLIB\cl5s-ec.r90"

Что я не правильно делаю, и как надо???
IgorKossak
Цитата(SasaVitebsk @ Jun 14 2006, 04:20) *
Подключил xcl файл, по образу и подобию "подсмотренному" в MAP файле. Но вот одна проблема

Почему-то не хочет переваривать следующую строку. (В MAP файле эта строка наблюдается)

-s __program_start "C:\IAR Systems\Embedded Workbench 4.0 Evalution\avr\LIB\CLIB\cl5s-ec.r90"

Что я не правильно делаю, и как надо???

Эта строка не нужна в xcl файле вообще.
_artem_
Цитата
Что такое _..X_EXT_NV_BASE и _..X_EXT_NV_SIZE?


Сегодня с той же проблемой столкнулся и нашел откуда компайлер это дурье приплюсовывает - когда линкует то к стандартному cfgm128.xcl (допустим для мега128) еще добавляется cfg3s.xcl из того же template директории. И вот этот _..X_EXT_NV_BASE и _..X_EXT_NV_SIZE там и тусуется. И нигде в документации его описание не нашел.

iar 4.20
IgorKossak
Шаблонные файлы из директории template берутся в случае настройки линкера из IDE.
Чтобы избежать подобных нюансов и неоднозначностей я всегда рекомендую скопировать один cfgm128.xcl (допустим для мега128) в директорию проекта и все настройки делать в нём, а не из IDE.
Это и меет ещё и тот плюс, что проекты даже на одном МК, как правило, разные и им нужны разные настройки, которые удобнее держать в папке проекта. Это опять же удобно для переносимости (на другой комп, например) или для архивирования.
_artem_
Наконец то переборол лень прочитал хлинк описание и поставил отдельный хцл файл.
Правда лень частично победила и написал чтотo вроде :

-Z(SPLIT-DATA)NEAR_I,NEAR_Z,NEAR_C,NEAR_N=_..X__SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE:+_..X__EXT_SRAM_SIZE

Вопросик такой - кто нибудь использует такие распределенные между внутренней и внешней памятью сегменты как наверху ? Есть подвох в этом?
Понятно что для быстрого доступа к опеределенным переменным я могу свой сегмент создать, а так, если мне без разницы, то зачем не позволить линкеру сделать это неблагодарное дело за меня?
SasaVitebsk
Цитата(_artem_ @ Aug 18 2007, 19:10) *
Наконец то переборол лень прочитал хлинк описание и поставил отдельный хцл файл.
Правда лень частично победила и написал чтотo вроде :

-Z(SPLIT-DATA)NEAR_I,NEAR_Z,NEAR_C,NEAR_N=_..X__SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE:+_..X__EXT_SRAM_SIZE

Вопросик такой - кто нибудь использует такие распределенные между внутренней и внешней памятью сегменты как наверху ? Есть подвох в этом?
Понятно что для быстрого доступа к опеределенным переменным я могу свой сегмент создать, а так, если мне без разницы, то зачем не позволить линкеру сделать это неблагодарное дело за меня?


Да вроде нет. У меня всё распределено верно. Хотя проект крупный относительно. Озу - 8к. К распределению переменных не касался и свои сегменты не создавал. И, если честно, то не могу понять как создание своего сегмента может ускорить доступ к определённым переменным.

Если потом интересует, то смотрел распределение памяти по переменным в MAP файле.
_artem_
Дык это изза лени ). У меня сейчас где то около 27 КБ озу. В случае с символьным меню будет где то 40 КБ.
Если распределение памяти делать используя SPLIT то не надо думать попадет ли сегмент во внутреннее озу или во внешнее и разрывов (неиспольззуемой памяти изза того что сегмент слишком большой для внутренней памяти, и вследствии чего будет размешен во внешний ) не будет. Распределение памяти насколько я понял по сегментам идет в последовательности в которой они задекларированы в хцл файле. если задача требует чтобы доступ к переменным, которые могут быть размешены во внешней памяти тоже (допустим NEAR_I), был быстрым и их количество мало, то для них можно создать свой собственный сегмент и для него в хцл файле описать размешение во внутреннюю память которая быстрее чем внешняя на sram.
SasaVitebsk
Блин. biggrin.gif Теперь понял о чём речь. smile.gif Да... об этом я не подумал. У меня только внутренняя RAMа. А вот-вот будет внутренняя/внешняя. Наверное к тебе обращаться буду. Как к разобравшемуся. smile.gif Пока раньше времени не хочу голову забивать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.