maxntf 0 15 августа, 2018 Опубликовано 15 августа, 2018 (изменено) · Жалоба Всем привет. Для написания собственного бутлоадера, интересует что находится между окончанием таблицы прерываний и адресом входа в основную программу (в частности начало файла startup)? Начинается с такого: 0x080000C0 F000F802 BL.W __scatterload (0x080000C8) 0x080000C4 F000F83E BL.W __rt_entry (0x08000144) 0x080000C8 A00C ADR r0,{pc}+0x34; @0x080000FC ... Это в Keil по крайне мере. В отладчике проверил, в этот кусок кода попадаем в конце выполнения startup файла. Мысль одна, что это какая то подготовка регистров ядра. Кто может подсказать, там есть что-то важное или на этот кусок не нужно обращать внимания (не трогать его вообще) и там все всегда стандартно (одинаково)? Если этот код будет дублироваться как в самом загрузчике, так и в основной программе - это нормально? Или может в проекте с основной программой нужно как то написать scatter файл, чтоб проект вообще компилировался без этой инициализации и startup файла? Изменено 15 августа, 2018 пользователем maxntf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 15 августа, 2018 Опубликовано 15 августа, 2018 · Жалоба Достаточно лишь сделать scatter-файл (скрипт линкера), у которого FLASH начинается с нужного вам адреса и с этим файлом собрать прошивку, которую будете заливать через собственный загрузчик. Это же можно сделать через настройки проекта. В своем загрузчике перед передачей управления запретить все прерывания, отключить всю уже включенную периферию и настроить указатель стека SP на новое место, а уже в самом приложении до разрешения прерываний тут же сделать vector remap на новое место. В принципе, vector remap можно делать и в самом загрузчике. зы Эта тема с загручиком - старый махровый баян. Изобретать тут уже нечего. Пройдитесь поиском )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 15 августа, 2018 Опубликовано 15 августа, 2018 · Жалоба Для написания собственного бутлоадера, интересует что находится между окончанием таблицы прерываний и адресом входа в основную программу (в частности начало файла startup)? В гугл вбиваем "что такое map-файл" и читаем, читаем, читаем.... PS: Для таких вопросов есть спец. раздел: "Для начинающих". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxntf 0 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба Меня интересует, нужна ли повторная инициализация startup в основной программе, или от нее нужно избавиться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба Меня интересует, нужна ли повторная инициализация startup в основной программе, или от нее нужно избавиться? Будет лучше, если основную программу предполагать абсолютно независимой программой. Отсюда следует и ответ. А вот рассчитывать, чтобы эта инициализация в основной проге могла стартовать: 1) либо с произвольных значений регистров периферии (в этом случае в конце бутлоадера не нужно делать деинит использованной в нём периферии, но сама инициализация сложнее); 2) либо с дефолтных после-сбросовых значений регистров периферии (в этом случае в конце бутлоадера нужно сделать деинит всей использованной периферии до дефолтных значений, в этом случае инициализация проще) - это уже как удобнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба Меня интересует, нужна ли повторная инициализация startup в основной программе? Категорически обязательна! И она НЕ повторная, поскольку отличается от проекта к проекту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба Можно использовать NVIC_SystemReset Тогда и деинициализировать ничего не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба Можно использовать NVIC_SystemReset Тогда и деинициализировать ничего не надо. Как я понял, речь совсем о другом - очередная попытка съэкономить на спичках уменьшить расход флэши. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба Конечно. И упростить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба Можно использовать NVIC_SystemReset 1) ...и после сброса опять попадаем на бутлоадер. Замкнутый круг :laughing: Тогда и деинициализировать ничего не надо. 2) Не во всех МК сброс ядра вызывает и сброс периферии. Где-то для общесистемного сброса нужно использовать другие методы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба 1. Не верно, так как зависит от программиста 2. Мы говорим о STM32 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба 1) ...и после сброса опять попадаем на бутлоадер. Замкнутый круг :laughing: Ставим маркер в ОЗУ и пролетаем мимо, делов-то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба Ставим маркер в ОЗУ и пролетаем мимо, делов-то. Правильно товарищ пишет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба 1. Не верно, так как зависит от программиста Т.е.: если скажем возле устройства сидит программист Вася, и оно в этот момент выполняет сброс, то управление попадает в бутлоадер. А если сидит Петя, то после сброса управление попадает в другое место? :biggrin: 2. Мы говорим о STM32 Хммм... Очевидно Вы работали со всеми возможными STM32 и нынешними и даже будущими? :biggrin: Я бы не высказывался так категорично. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alechek 0 16 августа, 2018 Опубликовано 16 августа, 2018 · Жалоба 1) ...и после сброса опять попадаем на бутлоадер. Замкнутый круг :laughing: Даже если сбрасывается периферия, то ОЗУ остается. простейший флаг решает задачу. Другое дело, что у ядра не обязана быть реализация NVIC_SystemReset Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться