Перейти к содержанию
    

Не инициализируемая память.

Честно признаю, читал документацию. Даже сделал книжечки и постоянно в них лажу. Но к данному вопросу не знаю как подойти. Не разобрался по английски. :) Поэтому прошу не отфутболивать к документации, а кратко ответить (если можно).

 

Пытаюсь к ряду переменных пристегнуть спецификатор __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"

 

Про данные сегменты я читал, но как его объявить в опциях проекта. Чтобы не создавать файл опций.

Если можно, то с примером пожалуйста. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про данные сегменты я читал, но как его объявить в опциях проекта. Чтобы не создавать файл опций.

Если можно, то с примером пожалуйста. :)

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

*.xcl файл, то в IDE опциях линкера есть раздел 'extra options', куда и вписать командную строчку.

Есть и 'wizard' для 'генерации', но думаю, что лучше его нафиг послать ввиду его ничем не прикрытой убогости.

 

А редактировать придется - в Вашем файле сегмент описан, но его размер X_EXT_NV_SIZE мал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я смотрел доку по LINK. И если бы я в ней разобрался, то не стал бы никого беспокоить. :)

Описание опции -Z весьма скудное. Тоесть оно полное, но о таких вещах как _..X_EXT_NV_SIZE там не слова.

По моему глупо что сегмент NEAR_I (размеры и начало) линкер "понимает из проекта", а такой же NEAR_N - нет. В моём понимании, по опции __no_init компилятор должен был бы определить мои переменные в соответствующий сегмент. Соответственно линкер выделить под него место. Глупо выделять его вручную. Не хочу его размещать и привязывать к физическому адресу. А как указать линкеру, чтобы он сам зарезервировал место - не знаю.

Кроме всего попробовал дать команду в 'extra options', - так он гад пишет что не фиг мол два раза сегмент определять.

 

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

 

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

 

Ещё раз попрошу не отсылайте меня к документации. Ну не могу разобраться! Не может быть чтобы никто до меня данную проблему не решал. Кинте в меня примером строки из extra options или xcl файла. Или объясните ошибки. Буду очень благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

.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";

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема в следующем

-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 (в опциях проекта это, к сожалелению, сделать не получится если имеется определение для сегмента по умолчанию).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подключил xcl файл, по образу и подобию "подсмотренному" в MAP файле. Но вот одна проблема

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подключил xcl файл, по образу и подобию "подсмотренному" в MAP файле. Но вот одна проблема

 

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

 

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

 

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

Эта строка не нужна в xcl файле вообще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что такое _..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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Шаблонные файлы из директории template берутся в случае настройки линкера из IDE.

Чтобы избежать подобных нюансов и неоднозначностей я всегда рекомендую скопировать один cfgm128.xcl (допустим для мега128) в директорию проекта и все настройки делать в нём, а не из IDE.

Это и меет ещё и тот плюс, что проекты даже на одном МК, как правило, разные и им нужны разные настройки, которые удобнее держать в папке проекта. Это опять же удобно для переносимости (на другой комп, например) или для архивирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наконец то переборол лень прочитал хлинк описание и поставил отдельный хцл файл.

Правда лень частично победила и написал чтот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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наконец то переборол лень прочитал хлинк описание и поставил отдельный хцл файл.

Правда лень частично победила и написал чтот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 файле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык это изза лени ). У меня сейчас где то около 27 КБ озу. В случае с символьным меню будет где то 40 КБ.

Если распределение памяти делать используя SPLIT то не надо думать попадет ли сегмент во внутреннее озу или во внешнее и разрывов (неиспольззуемой памяти изза того что сегмент слишком большой для внутренней памяти, и вследствии чего будет размешен во внешний ) не будет. Распределение памяти насколько я понял по сегментам идет в последовательности в которой они задекларированы в хцл файле. если задача требует чтобы доступ к переменным, которые могут быть размешены во внешней памяти тоже (допустим NEAR_I), был быстрым и их количество мало, то для них можно создать свой собственный сегмент и для него в хцл файле описать размешение во внутреннюю память которая быстрее чем внешняя на sram.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин. :biggrin: Теперь понял о чём речь. :) Да... об этом я не подумал. У меня только внутренняя RAMа. А вот-вот будет внутренняя/внешняя. Наверное к тебе обращаться буду. Как к разобравшемуся. :) Пока раньше времени не хочу голову забивать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...