Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка при компиляции в IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
otrog
Здравствуйте.
При компиляции в Release в IAR 4.12A такого вот текста:
Код
#include <ioavr.h>
#include <inavr.h>

char i;
__eeprom char x;

int main( void )
{
  i = x;
  return 0;
}

Получаю сообщение smile3046.gif :
Цитата
Error[e133]: The output format intel-standard cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is wanted

Если компилировать в Debug, то все нормально.
Помогите кто можетhelp.gif.
ПС Файлы проекта прилагаю.Нажмите для просмотра прикрепленного файла
haker_fox
Дело в том, что стандартный интеловский формат не позволяет использовать два адресных пространства (в Вашем случае для FLASH и для EEPROM), сходите сюда, там рассказано, как решить проблему.
Sergio66
В опциях проекта Options-> Linker-> Extra Options поставьте галочку "Use command line options" и в поле укажите строку
-y(CODE)
И будет вам щщастя!
otrog
Цитата(Sergio66 @ May 31 2006, 11:25) *
В опциях проекта Options-> Linker-> Extra Options поставьте галочку "Use command line options" и в поле укажите строку
-y(CODE)
Поставил. Работает biggrin.gif .

Также попробовал:
Цитата
-we133=i
-Ointel-extended,(CODE)=%PROJ_NAME%.hex
-Ointel-extended,(XDATA)=ee_%PROJ_NAME%.hex
Тоже работает biggrin.gif .

Правда непонятно почему если в программ еиспользовать
Код
__eeprom char x = 0x55;

и второй вариант, то где искать прошивку ЕЕПРОМ-а. Получается только один файл с прошивкой ФЛЕШ-а glare.gif .
Хелп ми.
Igor26
-we133=i
-Ointel-extended,(CODE)=%PROJ_NAME%.hex
-Ointel-extended,(XDATA)=ee_%PROJ_NAME%.hex
и второй вариант, то где искать прошивку ЕЕПРОМ-а. Получается только один файл с прошивкой ФЛЕШ-а .
Хелп ми.

измените строку следующим образом:-Ointel-extended,(XDATA)=ee_%PROJ_NAME%.eep
Файл прошивки ЕЕПРОМ будет иметь расширение .eep
otrog
cranky.gif Чтото я торможу cranky.gif
Такое ощущение, что команды создать файлы прошивок для ФЛЕШ и ЕЕПРОМ линкер просто игнорирует wacko.gif .
Привожу скриншоты. Мож кто что еще посоветует.
Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла
Остальные закладки по дефолту.
После компиляции создается ОДин файл "testiar2.hex".
Если убрать сторчку "-we133=i" то выпадает таже ошибка.

Хелп help.gif
IgorKossak
В первом окне поставьте формат, иной нежели intel-extended (например, debug), во втором окне уберите строку подавления ошибки.
prottoss
Здравствуйте!



По поводу intel-standart и intel-extended. В последнем формате в выходном файле содержится и код для FLASH и код для EEPROM, т.е intel-extended формат поддерживает сегменты в файле для нескольких типов памяти, intel-standart формат поддерживает только один сегмент. Если Ваш программатор поддерживает файлы с несколкими сегментами, то можете пользоваться для компиляции выходного файла intel-extended форматом.



Для того чтобы получить два файла (один для кода , другой для EEPROM) в категории Linker на вкладке Extra Options установить флажок Use command line options
и вписать в мемо следующие строки
-y(CODE)
-Ointel-standard,(XDATA)=xxxxx.eep
где xxxxx.eep - файл прошивки для внешней SPI EEPROM



код будет скомпилирован в файл с форматом, который в укажете в категории Linker на вкладке Output или Extra Output. Файл xxxxx.eep будет скомпилирован в корневую папку проекта



Удачи!
IgorKossak
Цитата(prottoss @ May 31 2006, 14:30) *
По поводу intel-standart и intel-extended. В последнем формате в выходном файле содержится и код для FLASH и код для EEPROM, т.е intel-extended формат поддерживает сегменты в файле для нескольких типов памяти, intel-standart формат поддерживает только один сегмент. Если Ваш программатор поддерживает файлы с несколкими сегментами, то можете пользоваться для компиляции выходного файла intel-extended форматом.

Это не так!
Чтобы в этом убедиться, прилагаю стандарт.
zltigo
Цитата(IgorKossak @ May 31 2006, 14:37) *
Чтобы в этом убедиться, прилагаю стандарт.

Ну стандарт на "полный" формат. А базовый Интеловский это действительно только
записи 00 и 01 - когда-то 64K хватало :-) Потом пошли навороты, сначала сегменты а потом и линейные.
otrog
Цитата(IgorKossak @ May 31 2006, 15:28) *
В первом окне поставьте формат, иной нежели intel-extended (например, debug), во втором окне уберите строку подавления ошибки.

Поставил "debug-intel-std", во втором окне убрал строку подавления ошибки.
Выдает ошибку sad.gif
Цитата
Для того чтобы получить два файла (один для кода , другой для EEPROM) в категории Linker на вкладке Extra Options установить флажок Use command line options
и вписать в мемо следующие строки
-y(CODE)
-Ointel-standard,(XDATA)=xxxxx.eep
где xxxxx.eep - файл прошивки для внешней SPI EEPROM

Немогу найти файл "xxxxx.eep" sad.gif

Вобщем засада wacko.gif
IgorKossak
Цитата(otrog @ May 31 2006, 15:36) *
Цитата(IgorKossak @ May 31 2006, 15:28) *

В первом окне поставьте формат, иной нежели intel-extended (например, debug), во втором окне уберите строку подавления ошибки.

Поставил "debug-intel-std", во втором окне убрал строку подавления ошибки.
Выдает ошибку sad.gif

Не думал, что будет так тяжко.
Обьясняю подробнее.
Линкер последовательно делает сначала задания из первого окна, затем из второго.
В первом окне (независимо от содержимого второго окна) Вы заставляете линкер сгенерировать выходной файл (файлы) формата intel-hex (в данном случае не важно, extended или standard). Но этот формат не поддерживает более одного пространства памяти и в этом же окне нет никаких опций для вариантов. Поэтому я Вам привёл пример с форматом debug, которому всё равно какие у Вас пространства.

Для того, чтобы изощряться с опциями и вариантами, существует второе окно, где Вы правильно указали и формат и пространства и расширения.

Подавлять диагностику (предупреждения и ошибки) это всё равно, что делать вид, что всё хорошо, когда всё плохо.

И напоследок.
Формат intel-standard - для пространств памяти не более 64 кБайт и без указания стартовой точки.
Формат intel-extended - для пространств, адресуемых 24- или 32-битной шиной адреса и с возможностью указать стартовую точку приложения.
prottoss
Цитата(prottoss @ May 31 2006, 19:30) *
Для того чтобы получить два файла (один для кода , другой для EEPROM) в категории Linker на вкладке Extra Options установить флажок Use command line options
и вписать в мемо следующие строки
-y(CODE)
-Ointel-standard,(XDATA)=xxxxx.eep
где xxxxx.eep - файл прошивки для внешней SPI EEPROM


Извиняюсь дико за неточность - скопировал тект из своего же комментария к исходнику, и не поправил строку! : "... где xxxxx.eep - файл прошивки для внешней SPI EEPROM ..." надо читать как "... где xxxxx.eep - файл прошивки EEPROM ..."



Цитата(IgorKossak @ May 31 2006, 20:56) *
И напоследок.
Формат intel-standard - для пространств памяти не более 64 кБайт и без указания стартовой точки.
Формат intel-extended - для пространств, адресуемых 24- или 32-битной шиной адреса и с возможностью указать стартовую точку приложения.
Согласен, я был не точен, но ведь intel-extended так же включает несколько сегментов (допучим сегмент кода и сегмент данных), не так ли? И, кстати, как Вы переведеты эту строку на русский? "Error[e133]: The output format intel-standard cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is wanted" Я читаю примерно следующие: "Выходной формат intel-standard не имеет заголовка для нескольких сегментов... используйте варианты формата, чтобы указать искомые адресные простраства...."
IgorKossak
Цитата(prottoss @ May 31 2006, 17:31) *
... но ведь intel-extended так же включает несколько сегментов (допучим сегмент кода и сегмент данных), не так ли? И, кстати, как Вы переведеты эту строку на русский? "Error[e133]: The output format intel-standard cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is wanted" Я читаю примерно следующие: "Выходной формат intel-standard не имеет заголовка для нескольких сегментов... используйте варианты формата, чтобы указать искомые адресные простраства...."

Сегмент(ы) кода и\или сегмент(ы) данных, но ОДНОГО пространства!
Это ЛИБО флэш, ЛИБО ЕЕПРОМ, ЛИБО ОЗУ, но никогда не смесь всего этого в одном выходном файле.
В стандарте на формат описываются все команды, но среди них нет команды, идентифицирующей адресное пространство, как впрочем и сегмент.

Кстати, более точный перевод приведённого Вами текста: "Выходной формат intel-standard не может поддерживать множественные адресные пространства ...".

Ну и посудите сами. Флэш память начинается с 0, ЕЕПРОМ начинается с 0, ОЗУ по большому счёту тоже с 0. Ну и как это всё описать в intel-hex формате?
prottoss
Цитата(IgorKossak @ May 31 2006, 22:47) *
Кстати, более точный перевод приведённого Вами текста: "Выходной формат intel-standard не может поддерживать множественные адресные пространства ...".
Тогда что Вы подразумевает е под термином "адресное пространство" и "множественные адресные пространства"
IgorKossak
Цитата(prottoss @ May 31 2006, 17:58) *
... Тогда что Вы подразумевает е под термином "адресное пространство" и "множественные адресные пространства"

Цитата
Это ЛИБО флэш, ЛИБО ЕЕПРОМ, ЛИБО ОЗУ

В Вашем случае имеет место смесь флэш и ЕЕПРОМ.
prottoss
Цитата(IgorKossak @ Jun 1 2006, 00:33) *
Цитата(prottoss @ May 31 2006, 17:58) *

... Тогда что Вы подразумевает е под термином "адресное пространство" и "множественные адресные пространства"

Цитата
Это ЛИБО флэш, ЛИБО ЕЕПРОМ, ЛИБО ОЗУ

В Вашем случае имеет место смесь флэш и ЕЕПРОМ.


В таком случае Вы самаи себе противоречите) Выше Вы говорили что:

Цитата(IgorKossak @ Jun 1 2006, 00:33) *
Сегмент(ы) кода и\или сегмент(ы) данных, но ОДНОГО пространства!
Это ЛИБО флэш, ЛИБО ЕЕПРОМ, ЛИБО ОЗУ, но никогда не смесь всего этого в одном выходном файле.
В стандарте на формат описываются все команды, но среди них нет команды, идентифицирующей адресное пространство, как впрочем и сегмент.


теперь Вы говорите что это "... В Вашем случае имеет место смесь флэш и ЕЕПРОМ..."
Alex11
Я сумел побороться только таким кривым способом. В основную компиляцию включил ключ -y, после чего ошибка исчезает и генерируется файл прошивки программы, а затем в строчку post-compilation написал еще одку полную команду линкеру с правильными ключиками и другим именем выходного файла, чтобы сгенерировал файл для eeprom.
otrog
Урааа! Заработало!!! w00t.gif

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

В результате в папке "\Release\Exe\" появятся три файла:
testiar2.d90 - Debug
testiar2.eep - EEPROM
testiar2.hex - Flash

Всем спасибо cheers.gif .
IgorKossak
Чем выдёргивать фразы из контекста, следовало бы чтать внимательнее.
Это относилось к формату intel-hex:
Цитата(IgorKossak @ Jun 1 2006, 00:33) *
Сегмент(ы) кода и\или сегмент(ы) данных, но ОДНОГО пространства!
Это ЛИБО флэш, ЛИБО ЕЕПРОМ, ЛИБО ОЗУ, но никогда не смесь всего этого в одном выходном файле.
В стандарте на формат описываются все команды, но среди них нет команды, идентифицирующей адресное пространство, как впрочем и сегмент.

А это относилось к случаю с Вашей программой как заданию для линкера в первом окне настроек:
Цитата
... В Вашем случае имеет место смесь флэш и ЕЕПРОМ..."
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.