Jump to content
    

Запуск приложения с иного адреса

Добрый день, коллеги!

 

Кучу документации от IAR бегло прочитал, но не могу найти зацепки. Прошу помощи.

 

Есть загрузчик. Свой. Рабочий. Он зашит в микроконтроллер. Есть приложение. В процессе разработки, более-менее работает. Есть возможность указать отладчику шить приложение в своё адресное пространство, как обычно, но запускаться с другого адреса: адреса загрузчика? Т.е. я хочу, чтобы приложение под отладкой запускалось из под моего загрузчика? Или такое вообще невозможно?

 

Либо, как указать отладчику модифицировать регистр VTOR под перемещённую таблицу векторов моего приложения (если такой вариант проще и вышеозвученный вопрос нереализуем)? Я понимаю, что в приложении можно насильно записывать в регистр VTOR адрес из скрипта линкера *.icf, но выглядит это, ИМХО, как-то немного некрасиво... Понимаю также, что отлаживать приложение можно без смещения, т.к. как единственное на микроконтроллере. Но хотелось бы так, как я описал выше.

 

Заранее всем спасибо)

Share this post


Link to post
Share on other sites

4 минуты назад, haker_fox сказал:

Кучу документации от IAR бегло прочитал, но не могу найти зацепки. Прошу помощи.

https://www.iar.com/knowledge/support/technical-notes/general/creating-a-bootloader-for-cortex-m/ видели?

Share this post


Link to post
Share on other sites

21 minutes ago, makc said:

видели?

Великолепно! То, что надо! Даже больше, чем я ожидал! Проверил, всё работает!

P.S. Искал в документации, поставляемой с инструментарием (в .pdf файлах). Оказывается, много полезной информации и в онлайне.

Share this post


Link to post
Share on other sites

Странные проблемы. IAR (как и любая другая среда) после загрузки образа делает аппаратный либо программный сброс, который сам по себе делает то, что вы хотите - запускает ваш загрузчик. И уже загрузчик должен прописывать VTOR, указатель стека и передавать управление приложению. Вот запустить приложение в обход загрузчика - это да, это надо приложить усилия (я для старого ИАРа писал файл с макросами отладчика, которые вычитывали из памяти адрес стека приложения, грузили его в нужный регистр, грузили VTOR, вычитывали адрес обработчика вектора сброса приложения и писали его в PC. Собственно, примерно то же делаю и с OpenOCD. 

Share this post


Link to post
Share on other sites

18 minutes ago, Сергей Борщ said:

Странные проблемы.

Согласен. Я и сам так думал. И ожидал такого поведения, т.к. микроконтроллеру ничего не остаётся, как начать исполнять код, где уже зашит мой загрузчик. Тем не менее, не получив такого поведения (VTOR был равен 0x00), я подумал, что может быть что-то изменилось в отладчике с выходом версии IAR 9.10. Но сейчас, перезагрузив компьютер, и запустив IAR заново, я получил ожидаемое поведение! Но все же подход, предложенный уважаемым @makc мне тоже интересен и полезен!

Share this post


Link to post
Share on other sites

IAR достаточно умный, чтобы при старте отладки кортексов установить стек и передать управление на ResetHandler самостоятельно на основе icf. Единственное, что должна прошивка сделать самостоятельно, это установить VTOR или сделать ремап, где это надо. Лучше это делать не в загрузчике, а в основной прошивке, потому что прошивка с таблицей векторов может поступать совершенно непредсказуемо. 

extern void(*__vector_table[])();
SCB->VTOR = (uint32_t)&__vector_table;

Этот простой код позволяет отлаживать код в какой угодно области памяти, хоть в SRAM. Просто переписав icf.

Если нет VTOR,  то там ремап есть. Для отладки в SRAM под условной компиляцией ремап делаю

#ifdef __DEBUG_SRAM__
// REMAP SRAM -> 0x00000000
SYSCFG->CFGR1 = _VAL2FLD(SYSCFG_CFGR1_MEM_MODE,3); 
#endif

При отладке чем-то менее умным ставлю в стартапе установку стека на основе скрипта линкера

extern void* __reserved_for_stack_end__;
__set_MSP((uint32_t)&__reserved_for_stack_end__);

 

Share this post


Link to post
Share on other sites

36 минут назад, haker_fox сказал:

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

Забыл упомянуть еще один момент - Эклипса после загрузки образа прошивки из .elf сама устанавливает счетчик команд на начальный адрес. Этот адрес в gcc устанавливается скриптом компоновщика через директиву ENTRY(). Поскольку ИАР тоже использует формат .elf - наверняка в нем тоже есть подобный механизм.

Share this post


Link to post
Share on other sites

8 minutes ago, Сергей Борщ said:

Поскольку ИАР тоже использует формат .elf - наверняка в нем тоже есть подобный механизм.

На текущий момент не знаю, что Вам ответить) С одной стороны, после перезагрузки компьютера с IAR всё стало работать ожидаемо. С другой стороны появилась альтернатива в виде отладки двух образов: и загрузчика и приложения. Понаблюдаю за ситуацией.

Share this post


Link to post
Share on other sites

On 3/27/2023 at 11:30 AM, haker_fox said:

С другой стороны появилась альтернатива в виде отладки двух образов: и загрузчика и приложения. Понаблюдаю за ситуацией.

Интересно, а Eclipse + GCC так можно ?

Share this post


Link to post
Share on other sites

9 minutes ago, dimka76 said:

Интересно, а Eclipse + GCC так можно ?

С ними не работаю. Увы, ответить тоже нечего...

Share this post


Link to post
Share on other sites

4 часа назад, Сергей Борщ сказал:

Странные проблемы. IAR (как и любая другая среда) после загрузки образа делает аппаратный либо программный сброс, который сам по себе делает то, что вы хотите - запускает ваш загрузчик. И уже загрузчик должен прописывать VTOR, указатель стека и передавать управление приложению. Вот запустить приложение в обход загрузчика - это да, это надо приложить усилия

Странно... Наверное у нас с вами разные IAR-ы. :wink: Мой всегда запускает именно загруженный образ (только что загруженный по CTRL-D). Я даже специально в каких-то проектах в списке конфигураций проекта завожу отдельную конфигурацию, для кода отлаживаемого в старших адресах флешь. При этом - отлаженная рабочая прошивка и загрузчик - остаются на своих штатных адресах внизу и никак не портятся и не запускаются при загрузке/отладке кода наверх.

Вот пример такого проекта:

image.png.7dff79750b3e504baa24fea68ee0eff2.png

Ставлю текущую конфигурацию "FLASH release high", жму CTRL-D и грузится/запускается образ с адреса 0x30000. В том время как загрузчик (находится по 0x0000) и рабочая отлаженная прошивка (находится по 0x10000) даже не запускаются. Ибо если бы загрузчик запустился, но бы передал управление на 0x10000.

Так можно отлаживать прошивку, не портя записанную отлаженную. Да и не перетирая лишний раз флешь, не снижая её ресурс.

 

PS: Никаких специальных телодвижений не делал - IAR у меня по умолчанию так делает (IAR 7.80.4 for ARM).

Share this post


Link to post
Share on other sites

Just now, jcxz said:

PS: Никаких специальных телодвижений не делал - IAR у меня по умолчанию так делает (IAR 7.80.4 for ARM).

Вы меня окончательно смутили)))) У меня 9.30.1 и за сегодняшний день о вёл себя по-разному. При этом в экспериментах я стирал всю память FLASH утилитой SEGGER J-Flash Lite... Ладно, сегодян у меня уже вечер. Завтра на свежую голову всё перепроверю.

Share this post


Link to post
Share on other sites

3 минуты назад, haker_fox сказал:

У меня 9.30.1 и за сегодняшний день о вёл себя по-разному.

Возможно есть какая-то галка в настройках. Меняющая поведение IAR-а. Не знаю, у меня всегда так себя вёл. Так как при создании нового проекта копирую обычно какой-нить старый проект и его модифицирую. Значит - все настройки копируются. Проектов с 0 в IAR for ARM не создавал уже лет ~13 как.  :wink:

Share this post


Link to post
Share on other sites

Да нет никакой галки. IAR-у вообще по барабану с какого адреса грузить. Что в icf и соответственно в elf написано, туда и грузит. Оттуда же и запускает. Думаете ему есть разница с 0x0800'0000, 0x0801'0000 или 0x2000'0000 грузить?

Share this post


Link to post
Share on other sites

Выспался:angel:

На свежую голову докладываю!

 

Итак, стёр полностью МК. Зашил приложение с адреса 0x08008000. Начальный (стартовый адрес) процессора: 0x08000000 (GD32F450ZKT6). Запускаю отладку, старт идёт с адреса приложения, т.е. с 0x08008000. С адреса 0x08000000 записаны 0xff, там ПО выполняться не может: по адресу 0x08000004 находится адрес 0xffffffff. Т.е. IAR - действительно умный!

 

Записываю в микроконтроллер загрузчик с адреса 0x08000000. Приложение остаётся записанным. Приложение запускается загрузчиком без отладки, как и должно быть.

 

Зашиваю приложение под отладкой. По адресу 0x08000004 находится адрес начала программы загрузчика.

image.thumb.png.49e9f7a6db56ebef075a80fef1698f73.png

Ставлю туда точку останова:

image.png.ffcc23dbb56197f102f5b0633e338893.png

И никогда сюда не попадаю, отлаживая приложение. Вернее, сейчас отлаживать приложение бесполезно, т.к. VTOR = 0. Но всё же оно запускается до возникновения первого прерывания, которое реально обрабатывается, и неправильно, в области таблицы векторов загрузчика из-за некорректного VTOR.

 

Итого, имею зашитые загрузчик и приложение. Под отладкой стартует сразу приложение. Без отладки, естественно, всё как и положено работает в штатном режиме.

 

Добавляю отладчику ключ, указывающий расположение таблицы векторов. И говорю ему, что она расположена по адресу 0x08000000, т.е. в области записанного мной загрузчика.

image.png.303703bd25a954e546fdb31bed091ffc.png

Запускаю отладку приложения.

Сразу попадаю на адрес начала загрузчика!

image.png.bde43d763e2363432f8ed343bafb96e2.png

 

Нажимаю F5, запускаю исполнение ПО и... всё работает! Т.е. мой загрузчик запускает приложение, VTOR имеет адекватное значение 0x08008000.

 

Бррр.... Урра!:angel::blum::drinks::acute:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...