Перейти к содержанию
    

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

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

 

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, makc said:

видели?

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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__);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, dimka76 said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, jcxz said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выспался: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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...