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

 
 
 
Reply to this topicStart new topic
> Как в HEX-файл добавить кусок другого HEX-а?, Который должен начинаться с заданного адреса
Дон Амброзио
сообщение May 5 2008, 13:06
Сообщение #1


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Нужно добавить в прошивку программы, сгенерированную AVR Studio, некий внешний блок данных (имеется в виде HEX-файла), который нужно разместить во FLASH по заданному адресу.

Т.е. нужно объединить два HEX-файла так, чтобы данные второго файла размещались в объединённом файле по некоторому заданному адресу


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
galjoen
сообщение May 5 2008, 13:27
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Дон Амброзио @ May 5 2008, 17:06) *
Т.е. нужно объединить два HEX-файла так, чтобы данные второго файла размещались в объединённом файле по некоторому заданному адресу

А почему нельзя просто копированием через буфер обмена объединить? Я всегда так делаю. Или вам надо адреса во втором HEX-файле поменять, а сгенерить HEX с заданными адресами тяжело? Или в чём проблемма?
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение May 5 2008, 13:34
Сообщение #3


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Цитата(galjoen @ May 5 2008, 17:27) *
А почему нельзя просто копированием через буфер обмена объединить? Я всегда так делаю. Или вам надо адреса во втором HEX-файле поменять, а сгенерить HEX с заданными адресами тяжело? Или в чём проблемма?


Есть уже сгенерированный HEX-данных, в котором прописаны адреса, а мне нужно этот HEX объединить с прошивкой программы, чтобы эти данные были размещены по заданному адресу FLASH.

Т.е. нужно переместить этот HEX-данные в адресном пространстве о объединить с прошивкой


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
galjoen
сообщение May 5 2008, 13:58
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Дон Амброзио @ May 5 2008, 17:34) *
Есть уже сгенерированный HEX-данных, в котором прописаны адреса, а мне нужно этот HEX объединить с прошивкой программы, чтобы эти данные были размещены по заданному адресу FLASH.

Т.е. нужно переместить этот HEX-данные в адресном пространстве о объединить с прошивкой

Я м.б. не понял сути проблеммы - вам нужно в HEX-файле данных менять адреса или нет?
Если эти HEX-данные имеют в своём HEX-файле не те адреса, которые вам нужны, и вы не можете изменить адреса при генерации HEX-файла (например этот HEX-файл сгенерирован не вами) и хотите изменить эти адреса перед объединением файлов - то в этом случае рекомендую написать простенькую програмку (хоть на бейсике, хоть на пёрле или C - что вам больше нравится), а может такая уже и готовая есть. Но, наверное, написать будет быстрее, чем найти. Я несколько раз такие писал, т.к. предыдущие терял.
Go to the top of the page
 
+Quote Post
de__
сообщение May 5 2008, 14:02
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 26
Регистрация: 19-03-08
Пользователь №: 36 045



как то такое я написал
http://kazus.ru/forum/topics/f_19425.html&...%CD%C8%C5#19425
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 5 2008, 14:27
Сообщение #6


Гуру
******

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



http://srecord.sourceforge.net/ обычно позволяет справиться с любыми проблемами. Ну а самый простой вариат воспользоватся допотопным и широко распространенным
Код
BIN2HEX Version 1.06
Copyright (c) 1993-1995 BITWARE.
All rights reserved.

Syntax: BIN2HEX [/option] binfile [hexfile]

<binfile> is the binary input file
<hexfile> is the Intel HEX file to create

<option>  may be any of the following

  /Ln     Bytes to read from binary file
  /In     Binary file starting offset
  /On     Output file address offset (where HEX data starts)
  /M      Merge data into existing HEX file
  /2      Generate HEX file using ext. segment address records (HEX86)
  /4      Generate HEX file using ext. linear address records (HEX386)
  /Q      Quiet mode (no statistics are displayed)
  /T      Exclude EOF record
  /A      Append to end of existing HEX file

И преобразовав предварительно в бинарники переклеить, как душе угодно.

Moderator:
Тему перенес, поскольку к AVR она не имеет отношения.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
galjoen
сообщение May 5 2008, 14:47
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(zltigo @ May 5 2008, 18:27) *
Ну а самый простой вариат воспользоватся допотопным и широко распространенным
И преобразовав предварительно в бинарники переклеить, как душе угодно.

Я пробовал такой способ, но если исходный HEX-файл с "дырками", то, полученный таким методом, - подряд. Хотя "дырки" можно любыми байтами заполнять. Или это у меня руки кривые - не разобрался? Но в любом случае - написать програмку проще и быстрее, чем разбираться.
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение May 5 2008, 17:29
Сообщение #8


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Проблему решил без всяких утилит благодаря Антону

"Доделал пару "софт под Win32"-"софт под ATMega128" до того, что уже пишет во FLASH в количестве "скока хочешь" слов (по два байта) по адресу "куда следует". И ни разу не ошибается!

И вот, когда уже вроде бы "всё пучком", ещё раз нарываюсь на грабли: в формате iHex НЕТУ никакой возможности адресовывать свыше 64 килобайт!!!

Я даже три книги купил, но там всё честно про формат написано - уже по-русски, чтобы быть уверенным. На адресацию отводится ровно 4 символа в формате HEX.

Анализ файла от ImageCraft выявил наличие в на границе перехода через 64k некоторой неоднородности в файле iHex:
______cut here ___________
:14FFA0009924AA24BB2441D0C1F044D0B1F0E8E2000F111F63
:14FFB400221F331F771C881C991CAA1CBB1C88169906AA0630
:14FFC800BB0628F0881A990AAA0ABB0A0395EA9559F726F40D
:14FFDC00082D192D2A2D3B2D13C07A928A929A92AA92BA9228
:10FFF000CA92EA938A939A93AA93BA938B859C8523
:020000021000EC
:14000000AD85BE85C32E0EF0CB260895C7FC17D0B991A991CC
:1400140099918991E991C990B990A99099908990799024963A
:140028000895E02FE12BE22BE32B0895E82FE92BEA2BEB2BFE
:14003C00089500951095209530950F5F1F4F2F4F3F4F0895DA
:1400500080959095A095B0958F5F9F4FAF4FBF4F0895689467
:1400640001C0E8942A93FA92EA92FF24EE2420E1000FFF1C26
______cut here ___________

Вот такая вот беда...

Видимо он куски памяти подсчитывает и закончив одину 64-килобайтную секцию начинает писать в другую.

Мне это не очень нравится, потому что может стать источником ошибки: а вдруг мне сразу во вторую часть писать нужно?

И вот ведь в чём прикол: я уже и программатор отстроил на максимальную гибкость, а тут...

В общем, я весь в расстройстве. Помогите, кто знает!

Спасибо.

……
Учитывая немаленькое число просмотров, дам ответ...
Ответ крылся в том самом неясном куске.

Если тип строки 00 - это данные. Если 01 - конец файла.
А если 02 - это команда изменения сегмента.

Сегменты дробятся с кратностью 16 байт. За командой идёт адрес сегмента - два байта, старший сначала(!).

При открытии файла, если сегмент не изменялся, пишем в нулевой сегмент. Поэтому в коротких программах эта строка "тип 02" вообще не встречается.

В начале каждой строки данных следует относительный адрес записи - адрес, куда эти данные писать.

Абсолютный адрес записи - нужно учесть текущий сегмент. Достаточно его умножить на 16 и прибавить к относительному адресу.

Всё!

Я записал 70% проца ATMega128 из iHex, считал и всё совпало. Да и прога - тоже работала как часы.

Всем спасибо. С форматом iH вопрос ясен.

Антон.
"(С)

Т.е. просто перед блоком данных вставляем директиву задания номера 16-ти байтного сегмента и вуаля. Ничего конвертить не надо . И смещения в добавленном блоке будут отсчитываться от начала заданного Вами сегмента, а не от начала памяти


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 5 2008, 17:42
Сообщение #9


Гуру
******

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



Цитата(Дон Амброзио @ May 5 2008, 19:29) *
Я даже три книги купил, но там всё честно про формат написано - уже по-русски, чтобы быть уверенным.

Навеное придется книги выбросить и просто в интернете взять стандарт в том числе описывающий и РАСШИРЕНИЯ первоначального варианта для сегментной и линейной адресации, и добавления стартовых адресов.


Цитата(Дон Амброзио @ May 5 2008, 19:29) *
Т.е. просто перед блоком данных вставляем директиву..

Надо было внятно сказать, что согласны руками каждый раз файл редактировать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение May 5 2008, 17:48
Сообщение #10


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Цитата(zltigo @ May 5 2008, 21:42) *
Надо было внятно сказать, что согласны руками каждый раз файл редактировать.

Дык "руками" и быстрей и надёжней получиться: написать какую одну строку между блоками HEX-а это ИМХО более быстро и наглядно, чем юзать "вслепую" утилиты командной строки имеющие список из 30 и более параметров командной строки. Почему "вслепую"? Да потому что эти утилиты даже ГУИ человеческого не имеют. А не дай бог ошибёсся в циферке и они тебя наконвертят - век потом глюки будешь выискивать.

А тут всё на виду. И блоки и адреса начальных сегментов этих блоков - ошибиться почти не возможно


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 5 2008, 17:51
Сообщение #11


Гуру
******

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



Эко Вас носит между ГУЯ-ми и руками в редакторе smile.gif Вы уж определитесь, чем командная строка сложнее редактирования smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение May 5 2008, 18:08
Сообщение #12


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Цитата(zltigo @ May 5 2008, 21:51) *
Эко Вас носит между ГУЯ-ми и руками в редакторе smile.gif Вы уж определитесь, чем командная строка сложнее редактирования smile.gif


А зачем мне методично и скрупулёзно вычислять 30 с хреном параметров командной строки (при слиянии в один например 10-ти HEX-файлов) когда я могу тупо скопипастить их в один файл и тупо указать адрес для каждого блока откуда его размещать..

Короче тема исчерпана. Можно её закрыть. Пусть каждый остаётся при своём мнении насчёт того, что удобней


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
galjoen
сообщение May 5 2008, 18:28
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Дон Амброзио @ May 5 2008, 21:48) *
написать какую одну строку между блоками HEX-а

С одной строкой не всегда получится. Для этого нужно чтобы:
1. программатор её понимал (если больше 64 кбайт программирует то есс-но понимает, а если меньше?)
2. программатор понимал и верно программировал HEX, не по увеличению адресов выстроенный, т.к. в конец HEX-а добавлятся середина будет. В противном случае 2 строки придётся добавлять (в начало и конец вставляемого блока) и в середину файла блок вставлять - место искать.

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

А вообще, если эту программу вы сами пишите, то всё эти проблеммы решаются директивой include.
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение May 5 2008, 18:50
Сообщение #14


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Цитата(galjoen @ May 5 2008, 22:28) *
А вообще, если эту программу вы сами пишите, то всё эти проблеммы решаются директивой include.

Это как это? Насколько мне известно с помощью упомянутой Вами директивы можно только .inc-файлы с текстом исходников вставлять, но никак не HEX-файлы с данными


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
galjoen
сообщение May 5 2008, 19:15
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Дон Амброзио @ May 5 2008, 22:50) *
Это как это? Насколько мне известно с помощью упомянутой Вами директивы можно только .inc-файлы с текстом исходников вставлять, но никак не HEX-файлы с данными

Так я это и имел ввиду. Откуда у вас HEX файл с данными взялся если вы сами всё пишите? Но даже если он и есть, то в исходный текст вида
Код
.db 0xXX, ....; 16 байт
.db 0xXX, ....; 16 байт
...

элементарно преобразуется, например, макрокомандой в текстовом редакторе. Если в нём дырок нет конечно. А т.к. это данные, то наличие дырок крайне маловероятно и труднообъяснимо.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 13:57
Рейтинг@Mail.ru


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