Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запихнуть содержимое bin файла в память программ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Karl
Как сказать компилятору, чтобы он поместил содержимое .bin файла в память программ?
IgorKossak
Цитата(Karl @ Jun 29 2006, 08:06) *
Как сказать компилятору, чтобы он поместил содержимое .bin файла в память программ?

Это надо сказать линкеру.
Опция --image_input
Код
--image_input=filename,symbol,segment,alignment

Всё подробно описано на стр 32 xlink.pdf
Karl
Спасибо, посмотрел. Линкеру сказал следующее: --image_input=test.bin,Bootstrap,CODE,1
При компиляции не ругается. Но в откомпилированном коде найти этот кусок не могу sad.gif И как к нему обращаться? В бинарнике находится массив, который нужно использовать в программе.
Волощенко
Привет! У меня была подобная проблема. Нужно было загружать Firmware в для специализированной микросхемы PF22622 от Infineon через ATmega128.
Я включил в свой проект компилятора ICCAVR от IAR еще один файл массива констант, отображаемый как массив шестнадцатиричных контстант, который после компиляции включается в коды для записи во Flash. А для перевода массива *.bin в *.hex констант написал маленькую программу CoderP.exe (ее высылаю в *.rar.). В ней нужно выбрать входной файл *.bin, а выходной *.hex будет совпадать по названию с входным. Программа также вычислит и выдаст размер файла констант ХХХ, это значение нужно вставить в размерность массива.
После перекодировки файл *.hex как массив констант немного дорадатывается вручную - к нему в начале добавляется следующая строка, и там же вводится нужное Вам название HEX_CODE и размерность ХХХ:
__farflash byte HEX_CODE[ХХХ]= {
а в конце файла строка:
};
не забудьте после сделать еще один перевод строки, иначе компилятор возмущается. Успехов!
Karl
Это не совсем то, что хотелось бы реализовать... Так как бинарник будет не один, а несколько, и они будут периодически меняться, хотелось бы, чтобы линкер при каждой новой компиляции брал текущую версию бинарника и заносил в проект. В Вашем случае обновлять файл придется ручками, или писать соответствующую программку.
Волощенко
Цитата(Karl @ Jul 3 2006, 14:15) *
Это не совсем то, что хотелось бы реализовать... Так как бинарник будет не один, а несколько, и они будут периодически меняться, хотелось бы, чтобы линкер при каждой новой компиляции брал текущую версию бинарника и заносил в проект. В Вашем случае обновлять файл придется ручками, или писать соответствующую программку.

Понял. Задача действительно другая. У меня было несколько версий загрузочных бинарников (для внутренних 51-х микроконтроллеров), но одновременно загружались две программы, а менялись они не чаще раза в год.
Мне тоже интересно знать, как другие решили для IAR-компилятора эту проблему. Удачи. smile.gif
IgorKossak
Цитата(Karl @ Jul 3 2006, 08:31) *
Спасибо, посмотрел. Линкеру сказал следующее: --image_input=test.bin,Bootstrap,CODE,1
При компиляции не ругается. Но в откомпилированном коде найти этот кусок не могу sad.gif И как к нему обращаться? В бинарнике находится массив, который нужно использовать в программе.

В указанном документе написано следующее:"...содержимое чисто бинарного файла будет включено в выходной код в сегмент такой-то только если Ваше приложение содержит обращение к символу Bootstrap (в данном случае)"
Где-нибудь в хедере обьявите следующее
Код
extern __flash unsigned char Bootstrap[100];

и где-нибудь в приложении обратитесь к этому массиву, например, прочитайте из него.
Wild
Цитата(Karl @ Jun 29 2006, 09:06) *
Как сказать компилятору, чтобы он поместил содержимое .bin файла в память программ?


Можно создать массив и проинициализировать его значениями из бинарника. Тогда проблема с обращеиями будет решена.
Можно написать несложную програмку которая создает сишный файл, в котором описан массив с вытащенными из бинарника значениями.
Karl
Цитата(IgorKossak @ Jul 3 2006, 18:38) *
Цитата(Karl @ Jul 3 2006, 08:31) *

Спасибо, посмотрел. Линкеру сказал следующее: --image_input=test.bin,Bootstrap,CODE,1
При компиляции не ругается. Но в откомпилированном коде найти этот кусок не могу sad.gif И как к нему обращаться? В бинарнике находится массив, который нужно использовать в программе.

В указанном документе написано следующее:"...содержимое чисто бинарного файла будет включено в выходной код в сегмент такой-то только если Ваше приложение содержит обращение к символу Bootstrap (в данном случае)"
Где-нибудь в хедере обьявите следующее
Код
extern __flash unsigned char Bootstrap[100];

и где-нибудь в приложении обратитесь к этому массиву, например, прочитайте из него.

Благодарю за помощь. Все получилось. smile.gif
shamray
Цитата(Karl @ Jul 4 2006, 06:18) *
Цитата(IgorKossak @ Jul 3 2006, 18:38) *


В указанном документе написано следующее:"...содержимое чисто бинарного файла будет включено в выходной код в сегмент такой-то только если Ваше приложение содержит обращение к символу Bootstrap (в данном случае)"
Где-нибудь в хедере обьявите следующее
Код
extern __flash unsigned char Bootstrap[100];

и где-нибудь в приложении обратитесь к этому массиву, например, прочитайте из него.

Благодарю за помощь. Все получилось. smile.gif


У меня МЕГА128 и если ложить по такому принципу бутлодер в пространство
-Z(CODE)BOOT=1E000-1FFFF

то при обращении к массиву Bootstrap (который должен лежать по жтому адресу) выдается ошибка

Код
Error[e18]: Range error,  
Number out of range. Valid range is -128 (-0x80) to 255 (0xFF).
File: D:\Projects\SVN_PRJ\hardware\UK0\Cfile\main.c, Line: 77  
Source: LDI R17, (bootmas) >> 8
  Where $ = main + 0x4  [0x2754]
            in module "main" (D:\Projects\SVN_PRJ\hardware\UK0\Cfile\Debug\Obj\main.r90),
            offset 0x4 in segment part 18, segment CODE
  What: 8 ? (bootmas >> 1 & 0x7FFFFFFF) >> 8 - 1 : bootmas [0x1E0]
  Allowed range: 0xFFFFFF01 - 0xFF
  Operand: bootmas [0x1e000]
           in module  Image file 0 (D:\Projects\SVN_PRJ\hardware\UK0\bootloader\Debug\Exe\bootloader.bin),
           Offset 0x0 in segment part 0, segment BOOT
Error[e122]: The address 0x1e000 is too large to be represented in the output format 'intel-standard'


Т.е. я так понимаю что он не понимает адресацию за пределами 0xffff. Как это можно обойти?
IgorKossak
Цитата(shamray @ Aug 17 2006, 14:54) *
Error[e122]: The address 0x1e000 is too large to be represented in the output format 'intel-standard'
[/code]

Т.е. я так понимаю что он не понимает адресацию за пределами 0xffff. Как это можно обойти?

Вместо выходного формата intel-standard использовать intel-extended.
shamray
Цитата(IgorKossak @ Aug 17 2006, 16:37) *
Цитата(shamray @ Aug 17 2006, 14:54) *

Error[e122]: The address 0x1e000 is too large to be represented in the output format 'intel-standard'
[/code]

Т.е. я так понимаю что он не понимает адресацию за пределами 0xffff. Как это можно обойти?

Вместо выходного формата intel-standard использовать intel-extended.



Удже поменял. Но ошибкка "Error[e18]: Range error" оталась.
IgorKossak
Цитата(shamray @ Aug 18 2006, 15:21) *
... ошибкка "Error[e18]: Range error" оталась.

Разумеется, осталась.
В Вашем случае bootmas имеет значение где-то 0x1xxxx, т. е. в 2 байта не влазит.
После сдвига вправо на 8, значение не влазит в один байт, а Вы его пытаетесь заслать в регистр (LDI R17, (bootmas) >> 8).
В таких случаях надо писать LDI R17, ((bootmas) >> 8) & 0xFF или LDI R17, LOW((bootmas) >> 8)
shamray
Цитата(IgorKossak @ Aug 18 2006, 16:24) *
Разумеется, осталась.
В Вашем случае bootmas имеет значение где-то 0x1xxxx, т. е. в 2 байта не влазит.


Этор мне понятно. Непонятно было как объяснить что bootmas надо брать 24 или 32-х разрядным. Я так понимаю IAR не умеет работать с указателями более 16 бит.

Цитата(IgorKossak @ Aug 18 2006, 16:24) *
После сдвига вправо на 8, значение не влазит в один байт, а Вы его пытаетесь заслать в регистр (LDI R17, (bootmas) >> 8).
В таких случаях надо писать LDI R17, ((bootmas) >> 8) & 0xFF или LDI R17, LOW((bootmas) >> 8)


Когда делаю такую асмовскую вставку ругается что не знает что такое bootmas, или это как-то по-другомв надо вставить? Куда копать дальше - незнаю.
IgorKossak
Цитата(shamray @ Aug 19 2006, 11:53) *
...Непонятно было как объяснить что bootmas надо брать 24 или 32-х разрядным. Я так понимаю IAR не умеет работать с указателями более 16 бит.

Если это указатель на flash память, то его можно обьявить с атрибутом __farflash или __hugeflash.
В таком случае указатель будет более 16 бит (см. описание компилятора).
В таком случае линкер может выдать сообщение об отсутствии некоторых сегментов, которые нужно определить в xcl файле.

PS Я это делал давно, могу и ошибаться.
Lexy_one
Подскажите пожалуста как и где объявить сегмент для вставки бинарника...
у меня iar avr v5.50 процессор Atmega32a.
Бинарник прописал в Raw binary image. А с объявлением сегмента чтото не получается.

Вопрос закрыт!!!

Была проблема с .xcl файлом. надо было убрать галочку с "Configure system using dialogs (not in .xlc file)"

PS.
Вот полезная ссылка - кому интересно...
http://supp.iar.com/Support/?note=14438&am...m=search+result

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.