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

 
 
 
Reply to this topicStart new topic
> IAR. Непонятное для меня поведение линкера., Как можно на выходе одновременно получить 3 файла - HEX, BIN, EEP ?
kv_addr
сообщение May 21 2006, 21:12
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Ситуация такова - создал проект, начал отрабатывать модули. В установках для Release на выходе установил для основного файла - "intel-standard". Кроме того указал создавать еще и дополнительный - "row-binary". Все вроде бы работало нормально, создавало HEX-файл с расширением a90 и двоичный файл с расширением bin. Так все было нормально до того момента, когда стало нужным задействовать в программе обращения к EEPROM и выводить файл его содержимого.

Короче, согласно мануалу для линкера создал xcl-файл. В хвосте дописал:
-y(CODE)
-Ointel-standard,(XDATA)=Test.eep

Запустил компиляцию, жду. После полуминуты ожидания принудительно обрубаю компиляцию и смотрю на результат: Test.a90 - как ему и положено, Test.eep - тоже нормальный создало, а вот Test.bin - родился размером за 3 Гб и намеревался расти дальше. В начале его - действительный бинарный код, а далее - толпа нулей, стремящаяся до бесконечности. ohmy.gif

Хорошо, в меню для линкера выключаю создание дополнительного файла. Все идет как по маслу, создаются два правильных Test.a90 иTest.eep.

Ладно, экспериментирую дальше, снова включаю создание дополнительного bin-файла, но в программе "глушу" все обращения к EEPROM. После компиляции получаются 3 правильных файла - a90, bin и eep. Естественно в EEPROM - 0 байт.

Вот и чешу репу, откуда берутся дрожжи, заставляющие непонятным образом линкер содавать дополнительный bin-файл с бесконечным шлейфом нулей.

Кто может что-либо подсказать на сей счет?

IAR AVR 4.12A
Go to the top of the page
 
+Quote Post
kv_addr
сообщение May 22 2006, 03:13
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Дальнейшие разборки поведения линкера привели к следующему:
Предположим, выставляю в General options на закладке Target в пункте System configuration птицу на Configure system using dialogs (not in XCL file).
Для линкера в Output выставляю intel-standard.
Убираю в программе обращения к EEPROM.
Генерирует нормальный HEX-файл.
Меняю intel-standard на raw-binary.
Генерирует нормальный BIN-файл.
Возвращаюсь назад к intel-standard и в программе разремливаю обращения к EEPROM.
Запускаю компиляцию и получаю: 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 на raw-binary.
Снова запускаю компиляцию и получаю "задумчивость" на длительное время - выходной файл растет до 4Гб (у меня на этом диске FAT32), после чего получаю радостное сообщение о невозможности создать выходной файл. Естественно, этот файл нахожу на своем законном месте, размером он 4Гб, в самом начале его - бинарный код, а дальше - нули до самого конца.
Конечно, ругнуться ошибкой e133 у него так и не получается, поскольку до этого дело не доходит.
Короче говоря, при попытке сгенерить BIN-файл, при условии, работы с EEPROM, хоть с XLC, хоть без, у линкера срывает крышечку.
По крайней мере у меня создалось впечатление, что это именно то.

Может кто-то с таким тоже сталкивался?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 22 2006, 07:16
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Не заставляйте линкер делать то, что он не должен делать если у Вас используется не одно пространство (The output format ... cannot handle multiple address spaces.).
В .xcl файле сделайте следующее:
-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep
-Oraw-binary,(CODE)=.bin
а в настройках оставьте генерацию, ну скажем, файла с отладочной информацией .dbg .
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 22 2006, 08:07
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(IgorKossak @ May 22 2006, 10:16) *
-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep

Что за фокусы с (CODE)/(XDADA)? У линкера там просто вариант формата, эквивалент опции
-Y документирован.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 22 2006, 08:47
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(zltigo @ May 22 2006, 11:07) *
Цитата(IgorKossak @ May 22 2006, 10:16) *

-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep

Что за фокусы с (CODE)/(XDADA)? У линкера там просто вариант формата, эквивалент опции
-Y документирован.

Читаем главу Restricting the output to a single address space в файле xlink.pdf
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 22 2006, 09:14
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(IgorKossak @ May 22 2006, 11:47) *
Читаем главу Restricting the output to a single address space в файле xlink.pdf

Спасибо! Минус документописателям :-( - в описании ключа ни сном ни духом ни отсылки.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kv_addr
сообщение May 22 2006, 09:42
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



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

Взять любой проект, где в программе есть обращения к EEPROM, указать линкеру, что ему нужно работать с конфигурационным файлом, в Output указать хотя бы ubrof, а в конфигурационный файл вставить следующие строки:

-Ointel-standard,(CODE)=$PROJ_DIR$\Release\Exe\Test.a90
-Ointel-standard,(XDATA)=$PROJ_DIR$\Release\Exe\Test.eep

Все пройдет нормально и сгенерируются 3 файла - .dbg, .a90 и .eep.

Потом добавить строку:

-Oraw-binary,(CODE)=$PROJ_DIR$\Release\Exe\Test.bin

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

Аналогичное произойдет, если указать в Output intel-standard а в конфигурационный файл сначала вставить строки:

-y(CODE)
-Ointel-standard,(XDATA)=$PROJ_DIR$\Release\Exe\Test.eep

Cгенерируются 2 файла - .a90 и .eep.

Добавить строку:

-Oraw-binary,(CODE)=$PROJ_DIR$\Release\Exe\Test.bin

и снова убедиться в вышеописанном.

Мало того, даже если не пользоваться дополнительным конфигурационным файлом, а использовать дефолтный, а в окне Linker/Extra Options поставит птицу на Use command line options и вставит в окно вышеуказанные строки, то произойдет все то же.

И только если заглушить в исходной программе обращения к EEPROM, тогда можно получить правильный бинарник, естественно, с пустым .eep файлом.

Советую все же самим убедиться в таком поведении линкера. IMHO, это есть глюк линкера.
IAR AVR v.4.12A.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 22 2006, 10:06
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Действительно глюк.
Тогда воспользуйтесь обходным манёвром, вместо строки
-Oraw-binary,(CODE)=.bin
вставьте строку
-Ompds-code,(CODE)=.bin
Это тот же бинарный формат, только называется иначе wink.gif
Go to the top of the page
 
+Quote Post
kv_addr
сообщение May 22 2006, 10:25
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Ну, вот, это как раз то, на что я хотел обратить внимание.

С mpds-code бинарник получается, но нет чистоты эксперимента - в хвост файла досыпаются нули. Проще уж hex2bin использовать для получения "чистого" бинарника.

А так хотелось красивого...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 22 2006, 11:04
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(kv_addr @ May 22 2006, 13:25) *
С mpds-code бинарник получается, но нет чистоты эксперимента - в хвост файла досыпаются нули.

Не понятно, с mpds-code тоже "досыпаются"?
У меня вроде всё нормально.
Go to the top of the page
 
+Quote Post
kv_addr
сообщение May 22 2006, 11:26
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Бинарник, размер которого меньше килобайта, досыпает нулями до килобайта. Такие пироги...

Это я о тестовой программке.
Go to the top of the page
 
+Quote Post
Alechin
сообщение Aug 21 2006, 14:42
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Что-то не получилось задать относительные пути (через $EXE_DIR$ и т.п.) - пишет "не могу открыть файл" с именем непоср. $EXE_DIR$, т.е. не выполняет подстановку. Это линекер так интерпретирует?.
Реагирует только на абсолютный путь в xcl, что не удобно.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 21 2006, 14:56
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Alechin @ Aug 21 2006, 17:42) *
Что-то не получилось задать относительные пути (через $EXE_DIR$ и т.п.) - пишет "не могу открыть файл" с именем непоср. $EXE_DIR$, т.е. не выполняет подстановку. Это линекер так интерпретирует?.
Реагирует только на абсолютный путь в xcl, что не удобно.

А Вы вообще никаких констант не пишите. Линкер по умолчанию кладёт выходные файлы в папку exe и даёт им имя проекта. Можно указать только расширения.
Я делаю так:
Код
-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep
Go to the top of the page
 
+Quote Post
Alechin
сообщение Aug 22 2006, 15:54
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Понятно.
Просто в одном из предыдущих постов увидел относительные пути (вернее оттуда скопировал), а оно не пошло.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 11 2006, 08:44
Сообщение #15


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Возвращаясь к теме формирования выходного файла в формате raw-binary.
IAR выпустил новый линкер, в котором, как утверждается, этот (описанный здесь) и некоторые другие баги исправлены.
Go to the top of the page
 
+Quote Post

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

 


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


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