Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Как в HEX-файл добавить кусок другого HEX-а?
Который должен начинаться с заданного адреса
Доделал пару "софт под 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-ти байтного сегмента и вуаля. Ничего конвертить не надо
Составить ответ | Вернуться на конференцию
Ответы