|
LPC23xx, firmware upgrade, Intel HEX, Keil, Как выловить EPT из HEX-файла? |
|
|
|
Jun 16 2011, 21:35
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(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 то уж точно точкой входа не может быть! точка входа обычно в библиотеке находится, там стек инитится, сегменты и т.п.
|
|
|
|
|
Jun 17 2011, 01:37
|

Местный
  
Группа: Свой
Сообщений: 231
Регистрация: 19-12-08
Из: Новосибирск
Пользователь №: 42 594

|
Цитата(aaarrr @ Jun 17 2011, 04:25)  Приложите лучше получившиеся scat и map. Галки и визарды - это всегда плохо. Да-да, выведите меня, пожалуйста, на чистую воду поскорее. Скучно тонуть в болоте.  Цитата(KRS @ Jun 17 2011, 04:35)  так отладка стартует все равно по Reset вектору.
ну main то уж точно точкой входа не может быть! точка входа обычно в библиотеке находится, там стек инитится, сегменты и т.п. Да, причём этот вектор указывает на boot loader. Он, boot loader, всё "инитит", что может, проверяет валидность "настоящей" области векторов и передаёт туда управление. IAR генерирует первую инструкцию, исполняемую после ResetVector, - "B __iar_program_start" - переход в область update кода - то, что нужно. Keil - делает что-то другое, там участвует выше упомянутый ("от Бога" даденный) файл lpc2300.s На этом глубина моего познания Keil заканчивается и начинается мель проблем. Внутренний голос мне уже подсказывает, что вы (команда уделивших внимание теме) сказали достаточно полезных слов, чтоб я "дожал" проблему до внятного результата. Тема, однако, пока не закрыта и если кто (например, aaarrr) сможет/захочет чего добавить, упростить мне задачу - заранее спасибо.
|
|
|
|
|
Jun 17 2011, 09:26
|

Местный
  
Группа: Свой
Сообщений: 231
Регистрация: 19-12-08
Из: Новосибирск
Пользователь №: 42 594

|
Цитата(aaarrr @ Jun 17 2011, 13:46)  Ваш проект имеет два load region'а, с адресами 0x00 и 0x20000. HEX получился совершенно корректный - двумя кусками с этими адресами. Так какие претензии к Keil'у? Это-то (то, что код корректный и работает) меня, похоже и сбило с толку, как я начинаю догадываться. Региона - да- два, а вот кусков в HEX-файле три. (правда, между вторым и третьим нет дырки) Претензия к Кейлу - в том, что *каждый* из трёх HEX-кусков сопровождается RecType5. Нужны только RecType4. RecType5 должен быть единственным - описывающим адрес старта. А пепел сыплю голова потому, что моё предположение о том, что код должен *работать* было, похоже, ошибочным. Нужно генерировать Update код целиком в Update сегменте, тогда стартовый адрес совпадёт с базовым адресом сегмента и один из трёх RecType5 имени Keil укажет на него. (Как бы ещё гуманно выбрать из трёх наилучший? По наибольшей похожести на "ноль"?) Однако такой код запустить из-под uVision IDE и пройти "по шагам" едва ли получится. Пожелание к Кейлу есть. Указать бы как-то стартовый адрес, отличный от базового адреса сегмента. Тогда описанное неудобство исчезнет. Спасибо, Ваш комментарий добавил уверенности в том, что нет грубого промаха в проекте.
Сообщение отредактировал svss - Jun 17 2011, 09:27
|
|
|
|
|
Jun 17 2011, 10:18
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(svss @ Jun 17 2011, 13:26)  тогда стартовый адрес совпадёт с базовым адресом сегмента и один из трёх RecType5 имени Keil укажет на него. Если базовый адрес сегмента (и, следовательно, точка входа) заранее известны, то зачем искать RecType5, который его сообщит? Цитата(svss @ Jun 17 2011, 13:26)  Однако такой код запустить из-под uVision IDE и пройти "по шагам" едва ли получится. Получится. Отладчик uVision умеет много такого, о чём вы и не догадываетесь. Посказка: см. тут.
|
|
|
|
|
Jun 17 2011, 11:08
|

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

|
QUOTE (scifi @ Jun 17 2011, 13:18)  Если базовый адрес сегмента (и, следовательно, точка входа) заранее известны, то зачем искать RecType5, который его сообщит? Речь идет, насколько я понял, не о полном образе, для которого точка входа совпадает с вектором сброса и совпадает с началом образа, а о некоем подменяемом приложении. Для этого случая возможны варианты.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 17 2011, 11:35
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Jun 17 2011, 15:08)  Речь идет, насколько я понял, не о полном образе, для которого точка входа совпадает с вектором сброса и совпадает с началом образа, а о некоем подменяемом приложении. Для этого случая возможны варианты. Ну так я и агитирую за вариант, при котором у подменяемого приложения точка входа была в самом младшем адресе двоичного образа. Тогда нет нужды искать эту точку в формате HEX. В конце концов, на загружаемый образ накладываются и иные требования (прежде всего разрешённый диапазон адресов, неплохо ещё добавить поле размера и контрольной суммы), так что фиксация точки входа не сильно затруднит. Кроме того, есть интересная "уязвимость" формата Intel HEX, ведь в нём могут быть повторяющиеся или перекрывающиеся записи, а также записи с обратным порядком адресов. Так что должна быть гарантия, что файл прошивки пришёл из добросовестного источника, либо защита от дурака и/или хулигана.
|
|
|
|
|
Jun 17 2011, 12:20
|

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

|
QUOTE (scifi @ Jun 17 2011, 14:35)  Ну так я и агитирую за вариант, при котором у подменяемого приложения точка входа была в самом младшем адресе двоичного образа. Ну и делайте в startup, все, что душа пожелает. Но в общем это не проблема. Сдается мне, что вы своими руками изобразили какую-то кашу из загрузчиков-ядер-приложений в ОДНОМ, а не разных проектах и теперь думаете а чего это оно получилось-то такое???? QUOTE (scifi @ Jun 17 2011, 14:35)  Так что должна быть гарантия, что файл прошивки пришёл из добросовестного источника, либо защита от дурака и/или хулигана. Ну так заливаете шифрованные. Я в HEX лью обычно только вторичный загрузчик. Дальше работает он. Заливку в HEX он тоже поддерживает, если очень попросить, но с контролем адресов - себя затереть не даст.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 18 2011, 04:46
|

Местный
  
Группа: Свой
Сообщений: 231
Регистрация: 19-12-08
Из: Новосибирск
Пользователь №: 42 594

|
Цитата(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
|
|
|
|
|
Jun 18 2011, 11:17
|

Местный
  
Группа: Свой
Сообщений: 231
Регистрация: 19-12-08
Из: Новосибирск
Пользователь №: 42 594

|
Цитата(aaarrr @ Jun 18 2011, 16:37)  Правильно будет настроить стек и кучу, а затем перейти на __main. То что вы привели не есть правильно, хотя при определенных условиях работоспособно. Спасибо. Я здесь же отвечу и zltigo. Правильно ли, нет ли писать максимум кода на C, оставляя ассемблера не более, чем обойтись нельзя, наверное, спорить смысла нет. Нельзя обойтись числом ассемблерных инструкций, меньшим одной. То, что код из одной ассемблерной инструкции уродлив я предлагаю считать частным мнением автора высказывания, зато он позволяет с помощью Keil получать результат эквивалентный IAR. Тут нелишне пожаловаться на судьбу и на рок в лице заказывающего музЫку и объяснить, что я всюду имел в виду Keil 3.0. Я это умалчивал, чтоб не исчез интерес пишущих к теме и избежать совета потребовать от свышестоящих заменить среду разработки. Такие дела.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|