Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC23xx, firmware upgrade, Intel HEX, Keil
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
svss
Здравствуйте, коллеги ARMатурщики.

Пришла нужда, сделал я, было, LPC2368/78 firmware upgrade (IAP+UART/IPMI) методом заливки Intel HEX файла и
интерпретации его на контроллере. По дороге заливщик/загрузчик вылавливает из HEX-потока стартовый
адрес (EPT) и хранит его вместе с дескриптором "upgrade"-кода во flash для последующих boot up.
Получаю HEX-файл с помощью IAR.

Ладно было дело, пока не заставила жизнь получить тот же HEX-файл с помощью Keil. Всё хорошо кроме одного:
не могу догадаться, где в полученном HEX-файле ловить EPT.

Если кто использует Intel HEX файл, полученный Keil, для прошивки fw upgrade, поделитесь, пож., опытом.

Спасибо. sm.gif
---

В принципе можно чуть продолжить для порядка: форум я читал, следов ответа найти не удалось,
знаю, что EPT попадает в HEX-файл из LPC2300.s, только попадает в "шифрованном" компилятором виде,
а уж дизассемблер на контроллере делать - вовсе тухлое занятие.
Потому и совет хочется. (Идеальный совет - "правильный" LPC2300.s,- только кто его даст... biggrin.gif )
zltigo
QUOTE (svss @ Jun 16 2011, 17:53) *
не могу догадаться, где в полученном HEX-файле ловить EPT.

Возьмите описание Intel HEX формата и реализуйте его ПОЛНОСТЬЮ. И настанет Вам счастье и независимость.
QUOTE
попадает в "шифрованном" компилятором виде,

Смешно sad.gif
svss
Цитата(zltigo @ Jun 16 2011, 22:27) *
Возьмите описание Intel HEX формата и реализуйте его ПОЛНОСТЬЮ. И настанет Вам счастье и независимость.

Смешно sad.gif

Я знаю, что Вы любите больше давать советы, чем отвечать на вопросы. Спасибо, но тема не про то.
Intel HEX формат я давно "взял", реализовал "полностью" и оно даже работает.

Если у Вас есть сомнения или возражения (например, Вы знаете конструкцию HEX, описывающую EPT), не сочтите за
труд ткнуть меня туда носом явно, а не намёком.

Если Вы найдёте время и силы для написания совета без отсылки к "сделай сам", спасибо. sm.gif
scifi
Цитата(svss @ Jun 16 2011, 20:07) *
Если Вы найдёте время и силы для написания совета без отсылки к "сделай сам", спасибо. sm.gif

Ну это уже просто неприлично. См. тут: Wikipedia: Intel HEX
Внимательно смотрим на record type 03, record type 05.
А вообще можно зафиксировать точку входа и не париться.
zltigo
QUOTE (scifi @ Jun 16 2011, 19:23) *
Внимательно смотрим на record type 02, record type 05.

Не 02 а 03


svss
Цитата(scifi @ Jun 16 2011, 23:23) *
Ну это уже просто неприлично. См. тут: Wikipedia: Intel HEX

Я понимаю, что тема про моветон вечна и потому приведу для Вас специально
отрывок от HEX-файла имени Keil, о котором и тема (она - не про Википедию, как Вам показалось)

Код
:0400000500000000F7
:020000040000FA
:0400000500020000F5
:020000040002F8

(секции с кодом "0" и "1" по понятным причинам опущены.)
Всё, других секций нету.

Так вот, Record Type 5 не имеет ничего общего с EPT, а Record Type 2 (и 3) в файле от Keil отсутствуют вовсе.
Возможно, проблема с проектом.

(для справки - огрызок от map-файла:
"Image Entry point : 0x0000016c" - стартовый адрес factory code (Image Validation &bootstrap). - он нам не нужен, его контроллер найдёт сам.
"main 0x00020035 Thumb Code" - очень похоже на то, что надо, но этот адрес есть только "зарытый" в виде индекса в инструкцию,
напоминающую branch(R0). Прошу прощения, я мнемонику ассемблера ещё на память не выучил всю blush.gif ))
Это я к тому, что Rec type 5 не описывает EPT, да и наличие двух стартовых точек комментировать таки просто неприлично.

(PSPS)
К предположению об ошибке в проекте - скриншот. Подскажите, если знаете, пож., что там плохо и где.
Второй файл - тот самый HEX от Keil - для сомневающихся в моём утверждении. Rec Type 5 там не две, а примерно четыре.


Цитата
А вообще можно зафиксировать точку входа и не париться.
Это я не понял. Разжуйте несчастному, как ея зафиксировать: возможно о том и плач. rolleyes.gif
zltigo
QUOTE (svss @ Jun 16 2011, 20:56) *
Так вот, Record Type 5 не имеет ничего общего с EPT

Не знаю, что Вы за три буквы http://www.google.lv/search?client=opera&a...channel=suggest упорно твердите, но 3 или 5 это именно Start Address в одном из двух форматах 20 или линейном 32bit. Для ARM использование '3' странновато, но как-то встречал.
QUOTE
Это я не понял. Разжуйте несчастному, как ея зафиксировать

Решите для себя и хотя-бы попытайтесь объяснить кто это такая "ея".
svss
Цитата(zltigo @ Jun 17 2011, 01:08) *
Не знаю, что Вы за три буквы http://www.google.lv/search?client=opera&a...channel=suggest упорно твердите, но 3 или 5 это именно Start Address в одном из двух форматах 20 или линейном 32bit. Для ARM использование '3' странновато, но как-то встречал.

Решите для себя и хотя-бы попытайтесь объяснить кто это такая "ея".

Ея (старорусск) - её, стартовую точку то есть. Ея её предлагали зафиксировать.
Не хочется предполагать, что предлагали с помощью
Код
#define __at(_addr) __attribute__ ((at(_addr)))
"дырявить" код.

Слово из трёх букв EPT в переводе с иностранного означает Entry Point (Table).
http://www.acronymattic.com/EPT.html
Это - не менее распространённое сокращение, чем RTFM.
(В первом посте перевод был уже дан, правда без ссылки)

Что касается Record Type 5, то он имеет отношение к Start Address для Intel x86, а в нашем случае (я файл выложил) указывает на начало
сегмента и к делу не относится, imho.
Вы, увы, не ссылаетесь на свой опыт. crying.gif Гугль- не панацея, википедия - не кладезь.
zltigo
QUOTE (svss @ Jun 16 2011, 21:34) *
Что касается Record Type 5, то он имеет отношение к Start Address...

Можете верить, можете не верить, мне все равно, но это он и есть.
QUOTE
Вы, увы, не ссылаетесь на свой опыт.

Мой опыт простирается от использования Intel HEX формата со времен когда писал загрузчики с перфоленты в 8080 и до нынешнего времени, когда использую его-же для загрузки Firmware в ARM. Полегчало?

svss
Цитата(zltigo @ Jun 17 2011, 01:44) *
Можете верить, можете не верить, мне все равно, но это он и есть.

Ммм... Причём их четыре, да? По-моему не смешно.
Тут вопрос не столько в вере сколько в здравом смысле и в генерируемом коде.
Я абсолютно не сомневаюсь, что Вы знаете, о чём пишете (просто потому, что я читаю этот форум давно: пишу редко),
однако мне Keil не показывает стартовый адрес в (единственной, я надеюсь) RT5. Как его "уговорить" я пока не догадался.

Цитата(zltigo @ Jun 17 2011, 01:44) *
Мой опыт простирается от использования Intel HEX формата со времен когда писал загрузчики с перфоленты в 8080 и до нынешнего времени, когда использую его-же для загрузки Firmware в ARM. Полегчало?

А как же! Родственная душа, всегда приятно. Я впервые парсил Hex во времена до 8080. Такой программатор был, Intellec назывался.
Крутая машина, чисто импортная, жгла ПЗУшки 256*4 (для Intel3000), понимал Hex-формат.
А в какой ARM Вы грузите FW и чем HEX получаете?


(ЗЫ) Я начал тему с того, что всё сделал и всё получилось из-под IAR. Сейчас глянул - действительно там (в HEX от IAR) -единственная
запись Type 5, и в ней - правильная точка входа. Как-то всё "само" работало, и я просто не интересовался, а тут - нате Вам... Keil.
Его, Кейла, ругать нельзя, его многие любят. (Но что-то в тему пока не пишут) :-;
zltigo
QUOTE (svss @ Jun 16 2011, 21:59) *
Ммм... Причём их четыре, да?

Не верю.
QUOTE
А в какой ARM Вы грузите FW и чем HEX получаете?

В LPC,ST,TI IAR/Keil/GCC
QUOTE (svss @ Jun 16 2011, 21:59) *
Такой программатор был, Intellec назывался.
Крутая машина, чисто импортная, жгла ПЗУшки 256*4 (для Intel3000), понимал Hex-формат.

Это не программатор, это отладочная система. Программатор там среди прочего. Как и HEX формат в первую очередь создавался не для программаторов а для ЗАГРУЗЧИКОВ, посему адрес по которому передавать управление после загрузки вещь обязательнейшая.
svss
Цитата(zltigo @ Jun 17 2011, 02:09) *
Не верю.

Справедливо не верите, я плохо посчитал. Там их не четыре, а всего три. Файл - выше, о какой вере речь?

Цитата(zltigo @ Jun 17 2011, 02:09) *
Это не программатор, это отладочная система. Программатор там среди прочего.

Я пользовал только программатор, о нём и написал. Да, это была пара стоек, в одной из них компьютер Hewlett Packard... bb-offtopic.gif

Собственно, спасибо Вам за труд и время. Надеюсь я был не слишком назойлив.
Доктор сказал: "в морг", значит - в морг. Если никто не подскажет как победить Keil, я напишу пост-процессор для HEX-файла, стирающий
лишние RT5 и внедряющий одну правильную. Коль нет автомата, поможет лопата. maniac.gif
KRS
я тоже первый раз слышу про EPT в данном контексте.
Причем здесь вообще таблица?
Используется понятие точка входа (entry point) без всяких таблиц, в данном случае.
И кстати типы записей 2 и 3 (с сегментами) я уже очень давно не встречал в HEX файлах.
А часть программ вообще с ними криво работает, особенно если сегменты перекрываются.

А если у вас в HEX файле несколько точек входа указано - значит проблема в исходниках.

svss
Цитата(KRS @ Jun 17 2011, 03:32) *
я тоже первый раз слышу про EPT в данном контексте.
Причем здесь вообще таблица?

Лингвистика сложна, ну её к Microsoft. (Это у них я научился называть точку входе EntryPoinT)
Table - обобщение. У контроллера LPC*subj это таки таблица. Таблица векторов прерываний. (Предлагаю измерение длины остановить и считать меня виноватым) biggrin.gif

Цитата(KRS @ Jun 17 2011, 03:32) *
А если у вас в HEX файле несколько точек входа указано - значит проблема в исходниках.

Возможно. Причём IAR этого не замечает, оба (IAR & Keil) через Jlink всё правильно заливают и отлаживают, и только Keil чего-то видит, но молчит и генерирует бессмысленный (если верить Вам и zltigo - а не верить тоже нехорошо) HEX-файл.
Вообще, я предпочитаю отделять вопросы религии от вопросов настройки проекта и багов-глюков инструментов.

Как, зачем компилятор (простите, скорее тут дело в линкере), будучи популярен и не убит молча генерирует три HEX записи типа 5?
Как исходные тексты, где нет и намёка на точку входа (кроме секретного слова "main") могут убивать компилятор линкер?
Простите эмоции. Желательна идея. Где, в каком месте проекта Keil я должен явно указать, что main() - точка входа?
Ну, или не main, а что-то другое (что, где)?

Наверное я слегка перегрелся и нуждаюсь в отдыхе с последующим чтением мануала от Кейл - чтоб он сдох был здоров.
У нас тут в Сибири уже 3 часа ночи, я пошёл спать. Завтра вернусь, всего вам.
aaarrr
Цитата(svss @ Jun 16 2011, 21:56) *
К предположению об ошибке в проекте - скриншот. Подскажите, если знаете, пож., что там плохо и где.

Приложите лучше получившиеся scat и map. Галки и визарды - это всегда плохо.
KRS
Цитата(svss @ Jun 17 2011, 01:09) *
Table - обобщение. У контроллера LPC*subj это таки таблица. Таблица векторов прерываний.

ну вектора исключений то у LPC23xx располагаются строго по фиксированному адресу.

Цитата(svss @ Jun 17 2011, 01:09) *
Возможно. Причём IAR этого не замечает, оба (IAR & Keil) через Jlink всё правильно заливают и отлаживают,

так отладка стартует все равно по Reset вектору.
A iar просто по умолчанию брекпоинт на main ставит. (в опциях run to main)


Цитата(svss @ Jun 17 2011, 01:09) *
(кроме секретного слова "main")

ну main то уж точно точкой входа не может быть!
точка входа обычно в библиотеке находится, там стек инитится, сегменты и т.п.
svss
Цитата(aaarrr @ Jun 17 2011, 04:25) *
Приложите лучше получившиеся scat и map. Галки и визарды - это всегда плохо.

Да-да, выведите меня, пожалуйста, на чистую воду поскорее. Скучно тонуть в болоте. sm.gif

Цитата(KRS @ Jun 17 2011, 04:35) *
так отладка стартует все равно по Reset вектору.

ну main то уж точно точкой входа не может быть!
точка входа обычно в библиотеке находится, там стек инитится, сегменты и т.п.

Да, причём этот вектор указывает на boot loader. Он, boot loader, всё "инитит", что может,
проверяет валидность "настоящей" области векторов и передаёт туда управление.

IAR генерирует первую инструкцию, исполняемую после ResetVector, -
"B __iar_program_start" - переход в область update кода - то, что нужно.

Keil - делает что-то другое, там участвует выше упомянутый ("от Бога" даденный) файл lpc2300.s
На этом глубина моего познания Keil заканчивается и начинается мель проблем.

Внутренний голос мне уже подсказывает, что вы (команда уделивших внимание теме) сказали
достаточно полезных слов, чтоб я "дожал" проблему до внятного результата.
Тема, однако, пока не закрыта и если кто (например, aaarrr) сможет/захочет чего добавить,
упростить мне задачу - заранее спасибо.
aaarrr
Цитата(svss @ Jun 17 2011, 05:37) *
Да-да, выведите меня, пожалуйста, на чистую воду поскорее. Скучно тонуть в болоте. sm.gif

Ваш проект имеет два load region'а, с адресами 0x00 и 0x20000. HEX получился совершенно корректный - двумя кусками с этими адресами. Так какие претензии к Keil'у?
svss
Цитата(aaarrr @ Jun 17 2011, 13:46) *
Ваш проект имеет два load region'а, с адресами 0x00 и 0x20000. HEX получился совершенно корректный - двумя кусками с этими адресами. Так какие претензии к Keil'у?

Это-то (то, что код корректный и работает) меня, похоже и сбило с толку, как я начинаю догадываться.

Региона - да- два, а вот кусков в HEX-файле три. (правда, между вторым и третьим нет дырки)
Претензия к Кейлу - в том, что *каждый* из трёх HEX-кусков сопровождается RecType5. Нужны только RecType4.
RecType5 должен быть единственным - описывающим адрес старта.

А пепел сыплю голова потому, что моё предположение о том, что код должен *работать* было, похоже, ошибочным.
Нужно генерировать Update код целиком в Update сегменте, тогда стартовый адрес совпадёт с базовым адресом сегмента и
один из трёх RecType5 имени Keil укажет на него.
(Как бы ещё гуманно выбрать из трёх наилучший? По наибольшей похожести на "ноль"?)

Однако такой код запустить из-под uVision IDE и пройти "по шагам" едва ли получится.
Пожелание к Кейлу есть. Указать бы как-то стартовый адрес, отличный от базового адреса сегмента.
Тогда описанное неудобство исчезнет.

Спасибо, Ваш комментарий добавил уверенности в том, что нет грубого промаха в проекте.
scifi
Цитата(svss @ Jun 17 2011, 13:26) *
тогда стартовый адрес совпадёт с базовым адресом сегмента и
один из трёх RecType5 имени Keil укажет на него.

Если базовый адрес сегмента (и, следовательно, точка входа) заранее известны, то зачем искать RecType5, который его сообщит?

Цитата(svss @ Jun 17 2011, 13:26) *
Однако такой код запустить из-под uVision IDE и пройти "по шагам" едва ли получится.

Получится. Отладчик uVision умеет много такого, о чём вы и не догадываетесь. Посказка: см. тут.
zltigo
QUOTE (scifi @ Jun 17 2011, 13:18) *
Если базовый адрес сегмента (и, следовательно, точка входа) заранее известны, то зачем искать RecType5, который его сообщит?

Речь идет, насколько я понял, не о полном образе, для которого точка входа совпадает с вектором сброса и совпадает с началом образа, а о некоем подменяемом приложении. Для этого случая возможны варианты.
scifi
Цитата(zltigo @ Jun 17 2011, 15:08) *
Речь идет, насколько я понял, не о полном образе, для которого точка входа совпадает с вектором сброса и совпадает с началом образа, а о некоем подменяемом приложении. Для этого случая возможны варианты.

Ну так я и агитирую за вариант, при котором у подменяемого приложения точка входа была в самом младшем адресе двоичного образа. Тогда нет нужды искать эту точку в формате HEX. В конце концов, на загружаемый образ накладываются и иные требования (прежде всего разрешённый диапазон адресов, неплохо ещё добавить поле размера и контрольной суммы), так что фиксация точки входа не сильно затруднит.
Кроме того, есть интересная "уязвимость" формата Intel HEX, ведь в нём могут быть повторяющиеся или перекрывающиеся записи, а также записи с обратным порядком адресов. Так что должна быть гарантия, что файл прошивки пришёл из добросовестного источника, либо защита от дурака и/или хулигана.
zltigo
QUOTE (scifi @ Jun 17 2011, 14:35) *
Ну так я и агитирую за вариант, при котором у подменяемого приложения точка входа была в самом младшем адресе двоичного образа.

Ну и делайте в startup, все, что душа пожелает. Но в общем это не проблема. Сдается мне, что вы своими руками изобразили какую-то кашу из загрузчиков-ядер-приложений в ОДНОМ, а не разных проектах и теперь думаете а чего это оно получилось-то такое????
QUOTE (scifi @ Jun 17 2011, 14:35) *
Так что должна быть гарантия, что файл прошивки пришёл из добросовестного источника, либо защита от дурака и/или хулигана.

Ну так заливаете шифрованные. Я в HEX лью обычно только вторичный загрузчик. Дальше работает он. Заливку в HEX он тоже поддерживает, если очень попросить, но с контролем адресов - себя затереть не даст.
scifi
Цитата(zltigo @ Jun 17 2011, 16:20) *
Ну и делайте в startup, все, что душа пожелает.
...
Ну так заливаете шифрованные.

Спасибо, у меня уже давно всё работает :-) Это я топикстартеру забот накидываю, чтобы не расслаблялся :-)
svss
Цитата(scifi @ Jun 17 2011, 17:18) *
Если базовый адрес сегмента (и, следовательно, точка входа) заранее известны, то зачем искать RecType5, который его сообщит?

Хороший вопрос. (Правда я на него неявно ответил выше)
Действительно искать не нужно, если код отлажен и его не нужно ходить по шагам.
Иначе стартовый адрес, как известно, всегда равен нулю, а точку входа нужно искать самому,
либо уговорить Keil поместить нужное в RecType5.

(Спасиб за ссылк.)

Цитата(scifi @ Jun 17 2011, 21:19) *
Спасибо, у меня уже давно всё работает :-) Это я топикстартеру забот накидываю, чтобы не расслаблялся :-)

Да, это дело.
Правда и у меня уже всё работает.

Тему можно было бы считать закрытой, но остался один вопрос, заданный в самом начале темы относительно
"правильного" lpc2300.s файла для Update кода. В случае его применения Update код можно отлаживать по
шагам.
Следуем правилу: "спросил-не ответили-ответь сам"

lpc2300_update.s
Код
;/*****************************************************************************/
;/* LPC2300_upd.S: Startup file for NXP LPC23xx/LPC24xx devices (update area) */
;/*****************************************************************************/
; Author: svss
; Note: this file was created using LPC2300.s (c)Philips/NXP/Keil as a sample.
; All copyrights are recognized.

; Area Definition and Entry Point
;  Startup Code must be linked first at Address at which it expects to run.

                AREA    RESET, CODE, READONLY
                ARM
Vectors         LDR     PC, __main        
;               LDR     PC, Undef_Addr
;               LDR     PC, SWI_Addr
;               LDR     PC, PAbt_Addr
;               LDR     PC, DAbt_Addr
                END
zltigo
QUOTE (svss @ Jun 18 2011, 07:46) *
Следуем правилу: "спросил-не ответили-ответь сам"

Лично я ни то, что спросили и уж тем более ни то, что Вы сами себе ответили зачем-то напрочь изуродовав startup, как минимум, вынеся из него всю инициализацию не понял. Ну да ладно.
aaarrr
Цитата(svss @ Jun 18 2011, 08:46) *
Тему можно было бы считать закрытой, но остался один вопрос, заданный в самом начале темы относительно
"правильного" lpc2300.s файла для Update кода. В случае его применения Update код можно отлаживать по
шагам.

Правильно будет настроить стек и кучу, а затем перейти на __main. То что вы привели не есть правильно, хотя при определенных условиях работоспособно.
svss
Цитата(aaarrr @ Jun 18 2011, 16:37) *
Правильно будет настроить стек и кучу, а затем перейти на __main. То что вы привели не есть правильно, хотя при определенных условиях работоспособно.

Спасибо.
Я здесь же отвечу и zltigo.
Правильно ли, нет ли писать максимум кода на C, оставляя ассемблера не более, чем обойтись нельзя, наверное, спорить смысла нет.
Нельзя обойтись числом ассемблерных инструкций, меньшим одной.

То, что код из одной ассемблерной инструкции уродлив я предлагаю считать частным мнением автора высказывания,
зато он позволяет с помощью Keil получать результат эквивалентный IAR.

Тут нелишне пожаловаться на судьбу и на рок в лице заказывающего музЫку и объяснить, что я всюду имел в виду Keil 3.0.
Я это умалчивал, чтоб не исчез интерес пишущих к теме и избежать совета потребовать от свышестоящих заменить среду разработки.
Такие дела. rolleyes.gif
zltigo
QUOTE (svss @ Jun 18 2011, 14:17) *
Я здесь же отвечу и zltigo.

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