haker_fox 126 March 27, 2023 Posted March 27, 2023 · Report post Добрый день, коллеги! Кучу документации от IAR бегло прочитал, но не могу найти зацепки. Прошу помощи. Есть загрузчик. Свой. Рабочий. Он зашит в микроконтроллер. Есть приложение. В процессе разработки, более-менее работает. Есть возможность указать отладчику шить приложение в своё адресное пространство, как обычно, но запускаться с другого адреса: адреса загрузчика? Т.е. я хочу, чтобы приложение под отладкой запускалось из под моего загрузчика? Или такое вообще невозможно? Либо, как указать отладчику модифицировать регистр VTOR под перемещённую таблицу векторов моего приложения (если такой вариант проще и вышеозвученный вопрос нереализуем)? Я понимаю, что в приложении можно насильно записывать в регистр VTOR адрес из скрипта линкера *.icf, но выглядит это, ИМХО, как-то немного некрасиво... Понимаю также, что отлаживать приложение можно без смещения, т.к. как единственное на микроконтроллере. Но хотелось бы так, как я описал выше. Заранее всем спасибо) Quote Share this post Link to post Share on other sites More sharing options...
makc 369 March 27, 2023 Posted March 27, 2023 · Report post 4 минуты назад, haker_fox сказал: Кучу документации от IAR бегло прочитал, но не могу найти зацепки. Прошу помощи. https://www.iar.com/knowledge/support/technical-notes/general/creating-a-bootloader-for-cortex-m/ видели? 1 Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 126 March 27, 2023 Posted March 27, 2023 · Report post 21 minutes ago, makc said: видели? Великолепно! То, что надо! Даже больше, чем я ожидал! Проверил, всё работает! P.S. Искал в документации, поставляемой с инструментарием (в .pdf файлах). Оказывается, много полезной информации и в онлайне. Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 179 March 27, 2023 Posted March 27, 2023 · Report post Странные проблемы. IAR (как и любая другая среда) после загрузки образа делает аппаратный либо программный сброс, который сам по себе делает то, что вы хотите - запускает ваш загрузчик. И уже загрузчик должен прописывать VTOR, указатель стека и передавать управление приложению. Вот запустить приложение в обход загрузчика - это да, это надо приложить усилия (я для старого ИАРа писал файл с макросами отладчика, которые вычитывали из памяти адрес стека приложения, грузили его в нужный регистр, грузили VTOR, вычитывали адрес обработчика вектора сброса приложения и писали его в PC. Собственно, примерно то же делаю и с OpenOCD. Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 126 March 27, 2023 Posted March 27, 2023 · Report post 18 minutes ago, Сергей Борщ said: Странные проблемы. Согласен. Я и сам так думал. И ожидал такого поведения, т.к. микроконтроллеру ничего не остаётся, как начать исполнять код, где уже зашит мой загрузчик. Тем не менее, не получив такого поведения (VTOR был равен 0x00), я подумал, что может быть что-то изменилось в отладчике с выходом версии IAR 9.10. Но сейчас, перезагрузив компьютер, и запустив IAR заново, я получил ожидаемое поведение! Но все же подход, предложенный уважаемым @makc мне тоже интересен и полезен! Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 March 27, 2023 Posted March 27, 2023 · Report post 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__); 1 Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 179 March 27, 2023 Posted March 27, 2023 · Report post 36 минут назад, haker_fox сказал: И ожидал такого поведения, т.к. микроконтроллеру ничего не остаётся, как начать исполнять код, где уже зашит мой загрузчик. Забыл упомянуть еще один момент - Эклипса после загрузки образа прошивки из .elf сама устанавливает счетчик команд на начальный адрес. Этот адрес в gcc устанавливается скриптом компоновщика через директиву ENTRY(). Поскольку ИАР тоже использует формат .elf - наверняка в нем тоже есть подобный механизм. Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 126 March 27, 2023 Posted March 27, 2023 · Report post 8 minutes ago, Сергей Борщ said: Поскольку ИАР тоже использует формат .elf - наверняка в нем тоже есть подобный механизм. На текущий момент не знаю, что Вам ответить) С одной стороны, после перезагрузки компьютера с IAR всё стало работать ожидаемо. С другой стороны появилась альтернатива в виде отладки двух образов: и загрузчика и приложения. Понаблюдаю за ситуацией. Quote Share this post Link to post Share on other sites More sharing options...
dimka76 89 March 27, 2023 Posted March 27, 2023 · Report post On 3/27/2023 at 11:30 AM, haker_fox said: С другой стороны появилась альтернатива в виде отладки двух образов: и загрузчика и приложения. Понаблюдаю за ситуацией. Интересно, а Eclipse + GCC так можно ? Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 126 March 27, 2023 Posted March 27, 2023 · Report post 9 minutes ago, dimka76 said: Интересно, а Eclipse + GCC так можно ? С ними не работаю. Увы, ответить тоже нечего... Quote Share this post Link to post Share on other sites More sharing options...
jcxz 350 March 27, 2023 Posted March 27, 2023 · Report post 4 часа назад, Сергей Борщ сказал: Странные проблемы. IAR (как и любая другая среда) после загрузки образа делает аппаратный либо программный сброс, который сам по себе делает то, что вы хотите - запускает ваш загрузчик. И уже загрузчик должен прописывать VTOR, указатель стека и передавать управление приложению. Вот запустить приложение в обход загрузчика - это да, это надо приложить усилия Странно... Наверное у нас с вами разные IAR-ы. Мой всегда запускает именно загруженный образ (только что загруженный по CTRL-D). Я даже специально в каких-то проектах в списке конфигураций проекта завожу отдельную конфигурацию, для кода отлаживаемого в старших адресах флешь. При этом - отлаженная рабочая прошивка и загрузчик - остаются на своих штатных адресах внизу и никак не портятся и не запускаются при загрузке/отладке кода наверх. Вот пример такого проекта: Ставлю текущую конфигурацию "FLASH release high", жму CTRL-D и грузится/запускается образ с адреса 0x30000. В том время как загрузчик (находится по 0x0000) и рабочая отлаженная прошивка (находится по 0x10000) даже не запускаются. Ибо если бы загрузчик запустился, но бы передал управление на 0x10000. Так можно отлаживать прошивку, не портя записанную отлаженную. Да и не перетирая лишний раз флешь, не снижая её ресурс. PS: Никаких специальных телодвижений не делал - IAR у меня по умолчанию так делает (IAR 7.80.4 for ARM). 1 Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 126 March 27, 2023 Posted March 27, 2023 · Report post Just now, jcxz said: PS: Никаких специальных телодвижений не делал - IAR у меня по умолчанию так делает (IAR 7.80.4 for ARM). Вы меня окончательно смутили)))) У меня 9.30.1 и за сегодняшний день о вёл себя по-разному. При этом в экспериментах я стирал всю память FLASH утилитой SEGGER J-Flash Lite... Ладно, сегодян у меня уже вечер. Завтра на свежую голову всё перепроверю. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 350 March 27, 2023 Posted March 27, 2023 · Report post 3 минуты назад, haker_fox сказал: У меня 9.30.1 и за сегодняшний день о вёл себя по-разному. Возможно есть какая-то галка в настройках. Меняющая поведение IAR-а. Не знаю, у меня всегда так себя вёл. Так как при создании нового проекта копирую обычно какой-нить старый проект и его модифицирую. Значит - все настройки копируются. Проектов с 0 в IAR for ARM не создавал уже лет ~13 как. Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 March 27, 2023 Posted March 27, 2023 · Report post Да нет никакой галки. IAR-у вообще по барабану с какого адреса грузить. Что в icf и соответственно в elf написано, туда и грузит. Оттуда же и запускает. Думаете ему есть разница с 0x0800'0000, 0x0801'0000 или 0x2000'0000 грузить? Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 126 March 28, 2023 Posted March 28, 2023 · Report post Выспался На свежую голову докладываю! Итак, стёр полностью МК. Зашил приложение с адреса 0x08008000. Начальный (стартовый адрес) процессора: 0x08000000 (GD32F450ZKT6). Запускаю отладку, старт идёт с адреса приложения, т.е. с 0x08008000. С адреса 0x08000000 записаны 0xff, там ПО выполняться не может: по адресу 0x08000004 находится адрес 0xffffffff. Т.е. IAR - действительно умный! Записываю в микроконтроллер загрузчик с адреса 0x08000000. Приложение остаётся записанным. Приложение запускается загрузчиком без отладки, как и должно быть. Зашиваю приложение под отладкой. По адресу 0x08000004 находится адрес начала программы загрузчика. Ставлю туда точку останова: И никогда сюда не попадаю, отлаживая приложение. Вернее, сейчас отлаживать приложение бесполезно, т.к. VTOR = 0. Но всё же оно запускается до возникновения первого прерывания, которое реально обрабатывается, и неправильно, в области таблицы векторов загрузчика из-за некорректного VTOR. Итого, имею зашитые загрузчик и приложение. Под отладкой стартует сразу приложение. Без отладки, естественно, всё как и положено работает в штатном режиме. Добавляю отладчику ключ, указывающий расположение таблицы векторов. И говорю ему, что она расположена по адресу 0x08000000, т.е. в области записанного мной загрузчика. Запускаю отладку приложения. Сразу попадаю на адрес начала загрузчика! Нажимаю F5, запускаю исполнение ПО и... всё работает! Т.е. мой загрузчик запускает приложение, VTOR имеет адекватное значение 0x08008000. Бррр.... Урра! Quote Share this post Link to post Share on other sites More sharing options...