|
Запихнуть содержимое bin файла в память программ |
|
|
|
Jun 30 2006, 11:35
|

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

|
Цитата(Karl @ Jun 29 2006, 08:06)  Как сказать компилятору, чтобы он поместил содержимое .bin файла в память программ? Это надо сказать линкеру. Опция --image_input Код --image_input=filename,symbol,segment,alignment Всё подробно описано на стр 32 xlink.pdf
|
|
|
|
|
Jul 3 2006, 05:31
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Спасибо, посмотрел. Линкеру сказал следующее: --image_input=test.bin,Bootstrap,CODE,1 При компиляции не ругается. Но в откомпилированном коде найти этот кусок не могу  И как к нему обращаться? В бинарнике находится массив, который нужно использовать в программе.
|
|
|
|
|
Jul 3 2006, 08:57
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377

|
Привет! У меня была подобная проблема. Нужно было загружать Firmware в для специализированной микросхемы PF22622 от Infineon через ATmega128. Я включил в свой проект компилятора ICCAVR от IAR еще один файл массива констант, отображаемый как массив шестнадцатиричных контстант, который после компиляции включается в коды для записи во Flash. А для перевода массива *.bin в *.hex констант написал маленькую программу CoderP.exe (ее высылаю в *.rar.). В ней нужно выбрать входной файл *.bin, а выходной *.hex будет совпадать по названию с входным. Программа также вычислит и выдаст размер файла констант ХХХ, это значение нужно вставить в размерность массива. После перекодировки файл *.hex как массив констант немного дорадатывается вручную - к нему в начале добавляется следующая строка, и там же вводится нужное Вам название HEX_CODE и размерность ХХХ: __farflash byte HEX_CODE[ХХХ]= { а в конце файла строка: }; не забудьте после сделать еще один перевод строки, иначе компилятор возмущается. Успехов!
Сообщение отредактировал Волощенко - Jul 3 2006, 09:21
Прикрепленные файлы
CoderP.rar ( 193.48 килобайт )
Кол-во скачиваний: 83
|
|
|
|
|
Jul 3 2006, 11:44
|
Местный
  
Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377

|
Цитата(Karl @ Jul 3 2006, 14:15)  Это не совсем то, что хотелось бы реализовать... Так как бинарник будет не один, а несколько, и они будут периодически меняться, хотелось бы, чтобы линкер при каждой новой компиляции брал текущую версию бинарника и заносил в проект. В Вашем случае обновлять файл придется ручками, или писать соответствующую программку. Понял. Задача действительно другая. У меня было несколько версий загрузочных бинарников (для внутренних 51-х микроконтроллеров), но одновременно загружались две программы, а менялись они не чаще раза в год. Мне тоже интересно знать, как другие решили для IAR-компилятора эту проблему. Удачи.
|
|
|
|
|
Jul 3 2006, 12:38
|

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

|
Цитата(Karl @ Jul 3 2006, 08:31)  Спасибо, посмотрел. Линкеру сказал следующее: --image_input=test.bin,Bootstrap,CODE,1 При компиляции не ругается. Но в откомпилированном коде найти этот кусок не могу  И как к нему обращаться? В бинарнике находится массив, который нужно использовать в программе. В указанном документе написано следующее:"...содержимое чисто бинарного файла будет включено в выходной код в сегмент такой-то только если Ваше приложение содержит обращение к символу Bootstrap (в данном случае)" Где-нибудь в хедере обьявите следующее Код extern __flash unsigned char Bootstrap[100]; и где-нибудь в приложении обратитесь к этому массиву, например, прочитайте из него.
|
|
|
|
|
Jul 3 2006, 12:40
|
Местный
  
Группа: Участник
Сообщений: 216
Регистрация: 26-05-06
Из: Коломна
Пользователь №: 17 479

|
Цитата(Karl @ Jun 29 2006, 09:06)  Как сказать компилятору, чтобы он поместил содержимое .bin файла в память программ? Можно создать массив и проинициализировать его значениями из бинарника. Тогда проблема с обращеиями будет решена. Можно написать несложную програмку которая создает сишный файл, в котором описан массив с вытащенными из бинарника значениями.
|
|
|
|
|
Jul 4 2006, 03:18
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Цитата(IgorKossak @ Jul 3 2006, 18:38)  Цитата(Karl @ Jul 3 2006, 08:31)  Спасибо, посмотрел. Линкеру сказал следующее: --image_input=test.bin,Bootstrap,CODE,1 При компиляции не ругается. Но в откомпилированном коде найти этот кусок не могу  И как к нему обращаться? В бинарнике находится массив, который нужно использовать в программе. В указанном документе написано следующее:"...содержимое чисто бинарного файла будет включено в выходной код в сегмент такой-то только если Ваше приложение содержит обращение к символу Bootstrap (в данном случае)" Где-нибудь в хедере обьявите следующее Код extern __flash unsigned char Bootstrap[100]; и где-нибудь в приложении обратитесь к этому массиву, например, прочитайте из него. Благодарю за помощь. Все получилось.
|
|
|
|
|
Aug 17 2006, 11:54
|

Частый гость
 
Группа: Свой
Сообщений: 114
Регистрация: 31-08-05
Из: Украина, Одесса
Пользователь №: 8 105

|
Цитата(Karl @ Jul 4 2006, 06:18)  Цитата(IgorKossak @ Jul 3 2006, 18:38)  В указанном документе написано следующее:"...содержимое чисто бинарного файла будет включено в выходной код в сегмент такой-то только если Ваше приложение содержит обращение к символу Bootstrap (в данном случае)" Где-нибудь в хедере обьявите следующее Код extern __flash unsigned char Bootstrap[100]; и где-нибудь в приложении обратитесь к этому массиву, например, прочитайте из него. Благодарю за помощь. Все получилось.  У меня МЕГА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. Как это можно обойти?
|
|
|
|
|
Aug 18 2006, 12:21
|

Частый гость
 
Группа: Свой
Сообщений: 114
Регистрация: 31-08-05
Из: Украина, Одесса
Пользователь №: 8 105

|
Цитата(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" оталась.
|
|
|
|
|
Aug 18 2006, 13:24
|

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

|
Цитата(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)
|
|
|
|
|
Aug 19 2006, 08:53
|

Частый гость
 
Группа: Свой
Сообщений: 114
Регистрация: 31-08-05
Из: Украина, Одесса
Пользователь №: 8 105

|
Цитата(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, или это как-то по-другомв надо вставить? Куда копать дальше - незнаю.
|
|
|
|
|
Aug 19 2006, 10:06
|

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

|
Цитата(shamray @ Aug 19 2006, 11:53)  ...Непонятно было как объяснить что bootmas надо брать 24 или 32-х разрядным. Я так понимаю IAR не умеет работать с указателями более 16 бит. Если это указатель на flash память, то его можно обьявить с атрибутом __farflash или __hugeflash. В таком случае указатель будет более 16 бит (см. описание компилятора). В таком случае линкер может выдать сообщение об отсутствии некоторых сегментов, которые нужно определить в xcl файле. PS Я это делал давно, могу и ошибаться.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|