|
|
|
Не инициализируемая память., Прошу сильно не пинать. |
|
|
|
Jun 3 2006, 16:23
|
Гуру
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521
|
Честно признаю, читал документацию. Даже сделал книжечки и постоянно в них лажу. Но к данному вопросу не знаю как подойти. Не разобрался по английски. Поэтому прошу не отфутболивать к документации, а кратко ответить (если можно). Пытаюсь к ряду переменных пристегнуть спецификатор __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" Про данные сегменты я читал, но как его объявить в опциях проекта. Чтобы не создавать файл опций. Если можно, то с примером пожалуйста.
|
|
|
|
|
Jun 3 2006, 16:47
|
Гуру
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244
|
Цитата(SasaVitebsk @ Jun 3 2006, 19:23) Про данные сегменты я читал, но как его объявить в опциях проекта. Чтобы не создавать файл опций. Если можно, то с примером пожалуйста. Это не прямо в 'проекте' - это в *.xcl файле - опции линкера. Соответственно смотреть документацию на линкер или прямо по "образу и подобию" остальных сегментов отредактировать файл *.xcl имя которого указано в 'проекте'. Если по каким-то непонятным причинам нехочется редактировать *.xcl файл, то в IDE опциях линкера есть раздел 'extra options', куда и вписать командную строчку. Есть и 'wizard' для 'генерации', но думаю, что лучше его нафиг послать ввиду его ничем не прикрытой убогости. А редактировать придется - в Вашем файле сегмент описан, но его размер X_EXT_NV_SIZE мал.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 3 2006, 23:02
|
Гуру
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521
|
Я смотрел доку по LINK. И если бы я в ней разобрался, то не стал бы никого беспокоить. Описание опции -Z весьма скудное. Тоесть оно полное, но о таких вещах как _..X_EXT_NV_SIZE там не слова. По моему глупо что сегмент NEAR_I (размеры и начало) линкер "понимает из проекта", а такой же NEAR_N - нет. В моём понимании, по опции __no_init компилятор должен был бы определить мои переменные в соответствующий сегмент. Соответственно линкер выделить под него место. Глупо выделять его вручную. Не хочу его размещать и привязывать к физическому адресу. А как указать линкеру, чтобы он сам зарезервировал место - не знаю. Кроме всего попробовал дать команду в 'extra options', - так он гад пишет что не фиг мол два раза сегмент определять. Можно конечно "извратится" и разместить переменные в каком-то своём сегменте, но по-моему должен быть какой-то прямой путь чтобы решить данную проблему. .xcl файл я не создавал, а пользуюсь закладками в опциях пакета. Ещё раз попрошу не отсылайте меня к документации. Ну не могу разобраться! Не может быть чтобы никто до меня данную проблему не решал. Кинте в меня примером строки из extra options или xcl файла. Или объясните ошибки. Буду очень благодарен.
|
|
|
|
|
Jun 4 2006, 12:07
|
Гуру
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095
|
Цитата(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";
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 5 2006, 09:11
|
Шаман
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221
|
Проблема в следующем Цитата -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 (в опциях проекта это, к сожалелению, сделать не получится если имеется определение для сегмента по умолчанию).
|
|
|
|
|
Oct 12 2006, 03:56
|
учащийся
Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249
|
Цитата Что такое _..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
--------------------
Зачем лаять на караван , когда на него можно плюнуть?
|
|
|
|
|
Aug 20 2007, 23:12
|
Гуру
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521
|
Цитата(_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 файле.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|