Jump to content
    

Как правильно перепрошить загрузчик

Здравствуйте.

Может ктото подасказать, как правильно перепрошить бутлоадер?

Мне приходит прошивка под БУТ, я её копирую в отдельную область флеша.

А теперь как то надо из под БУТа прошить самого себя.

Я правильно понимаю, что для начала мне надо создать прошивку, которая  будет лежать где то в конце флеша и заниматься только копированием данных из области А в Б. А потом просто в случае обновления бутлоадера прыгнуть туда из бутлоадера ?

Share this post


Link to post
Share on other sites

35 минут назад, MKdemiurg сказал:

Я правильно понимаю, что для начала мне надо создать прошивку

Для начала вам надо озаботиться тем, чтобы узнать: какой именно микроконтроллер вы собрались шить. Так как они бывают разные.

А также объяснить всем: что такое "под БУТ"? как именно вам приходит некая прошивка? Голубиной почтой или как? Куда приходит? и т.д.

PS: Если вы искали форум телепатов, то очевидно ошиблись адресом.  :unknw:

Share this post


Link to post
Share on other sites

44 minutes ago, MKdemiurg said:

А теперь как то надо из под БУТа прошить самого себя.

Сами загрузчики как правило не перешивают, а сразу делают как надо.

Но если очень нужно, то я бы сделал специальную прошивку, которую заливаем через текущий загрузчик как рабочую прошивку, бут запускает эту новую прошивку, которая перетирает старый загрузчик на новый, зашитый в ней в виде массива кода, а потом блокирует запуск прошивки и перезапускается, сразу заходя в уже новый загрузчик.

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

 

Share this post


Link to post
Share on other sites

Для безопасного обновления загрузчика (я хз что под загрузчиком имеется в виду, но пусть это будет некое ПО, которое принимает по какому-то интерфейсу прошивку и прошивает его вместо старой), загрузчиков должно быть несколько. Один активный, другой - не активный. При запуске стартует код выбора активного загрузчика. Этот код наитупейший, глюков тут быть не должно. Пусть он выбирает активный загрузчик по неким признакам целостности и актуальности (например, смотрит на версию). Этому загрузчику передается управление. А перешить можно только не активный загрузчик. Таким образом исключается возможность потерять загрузчик и превратить устройство в кирпич при любых мракобесиях (даже сбое питания) во время прошивки.

Либо другой вариант (но так или иначе все они будут примерно похожими друг на друга). Пишется начальный загрузчик, максимально простой, и его работа отлаживается до дыр. Этот загрузчик будет передавать управление другому загрузчику, который планируется быть обновляемым. Если при включении целостность обновляемого загрузчика нарушена, остаемся в начальном, сигнализируем ахтунгом и ждем нормальный загрузчик. Если же начальный загрузчик видит, что второй цел и невредим, отдает тому управление. Второй уже занимается своими делами, в результате либо ожидая прошивку рабочего ПО, либо передавая ему управление.

Share this post


Link to post
Share on other sites

1 hour ago, jcxz said:

Для начала вам надо озаботиться тем, чтобы узнать: какой именно микроконтроллер вы собрались шить. Так как они бывают разные.

А также объяснить всем: что такое "под БУТ"? как именно вам приходит некая прошивка? Голубиной почтой или как? Куда приходит? и т.д.

PS: Если вы искали форум телепатов, то очевидно ошиблись адресом.  :unknw:

GD32F303 CortexM4

Приходят по SPI.

Я не думаю, что это принципиально важно.

В общем если конкретизировать вопрос - как перепрошить область памяти, в которой уже находишься.

3 minutes ago, Arlleex said:

Для безопасного обновления загрузчика (я хз что под загрузчиком имеется в виду, но пусть это будет некое ПО, которое принимает по какому-то интерфейсу прошивку и прошивает его вместо старой), загрузчиков должно быть несколько. Один активный, другой - не активный. При запуске стартует код выбора активного загрузчика. Этот код наитупейший, глюков тут быть не должно. Пусть он выбирает активный загрузчик по неким признакам целостности и актуальности (например, смотрит на версию). Этому загрузчику передается управление. А перешить можно только не активный загрузчик. Таким образом исключается возможность потерять загрузчик и превратить устройство в кирпич при любых мракобесиях (даже сбое питания) во время прошивки.

два одинаковых загрузчика?

Share this post


Link to post
Share on other sites

1 минуту назад, MKdemiurg сказал:

В общем если конкретизировать вопрос - как перепрошить область памяти, в которой уже находишься.

В общем случае: переместить перепрошивающий код в другую область памяти (хоть в ОЗУ) и выполнить его оттуда.

Share this post


Link to post
Share on other sites

6 минут назад, MKdemiurg сказал:

два одинаковых загрузчика?

Ну если так получится, что у Вас два одинаковых окажется - то будет два одинаковых. Это не важно. Важно то, что один из них будет активным, а другой нет. И тот, который не активный можно смело перешивать, т.к. если что активным можно будет все исправить.

Share this post


Link to post
Share on other sites

1 hour ago, Forger said:

Сами загрузчики как правило не перешивают, а сразу делают как надо.

Но если очень нужно, то я бы сделал специальную прошивку, которую заливаем через текущий загрузчик как рабочую прошивку, бут запускает эту новую прошивку, которая перетирает старый загрузчик на новый, зашитый в ней в виде массива кода, а потом блокирует запуск прошивки и перезапускается, сразу заходя в уже новый загрузчик.

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

 

а что если часть загрузчика и HALа, связанного с Flash Memory Controller засунуть в RAM ?

Share this post


Link to post
Share on other sites

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

а что если часть загрузчика и HALа, связанного с Flash Memory Controller засунуть в RAM ?

Я так и делаю, например. Однако, Вы не уточнили, насколько безопасным должно быть обновление загрузчика.

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

Share this post


Link to post
Share on other sites

22 minutes ago, MKdemiurg said:

а что если часть загрузчика и HALа, связанного с Flash Memory Controller засунуть в RAM ?

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

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

Это будет происходить максимально быстро независимо от скорости загрузки прошивки по порту, ведь прошивка загрузчика уже загружена в тело прошивки и зашита где-то там в ней.

Задача состоит по сути в копировании одного куска флэши в другой.

 

Share this post


Link to post
Share on other sites

58 minutes ago, Arlleex said:

Я так и делаю, например. Однако, Вы не уточнили, насколько безопасным должно быть обновление загрузчика.

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

Максимально безопасным.

Копировать или сразу слинковать?

Я пытаюсь слинковать часть кода сразу

image.png.0702d1b078352fabc4779369173aff82.png

image.png.db48059e5a57b6e4537e53e894e89073.png

Но , тогда придётся переписывать ХАЛ под эту область или писать на регистрах.

Не могу найти мануал как прямо объектный фаил запихнуть в линкер скрипт?

идея в том, что сразу добавить gd32f30x_fmc.o ... целиком.

Как это правильно сделать с помощью линкера?

37 minutes ago, Forger said:

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

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

Это будет происходить максимально быстро независимо от скорости загрузки прошивки по порту, ведь прошивка загрузчика уже загружена в тело прошивки и зашита где-то там в ней.

Задача состоит по сути в копировании одного куска флэши в другой.

 

Наверно этот способ самый простой и надёжный.

Share this post


Link to post
Share on other sites

10 минут назад, MKdemiurg сказал:

Я пытаюсь слинковать часть кода сразу

Бессмысленно использовать для этого .ramfunc.

Если хотите что-то куда-то копировать (в памяти) и там запускать, то надо создавать отдельное приложение. Которое потом можно в том числе и включить в образ другой программы как бинарный файл.

Share this post


Link to post
Share on other sites

1 minute ago, jcxz said:

.ramfunc вам никак не поможет. Почему - подумайте сами.

Если хотите что-то куда-то копировать (в памяти) и там запускать, то надо создавать отдельное приложение. Которое потом можно в том числе и включить в образ другой программы как бинарный файл.

Вот тут не понял - я же буду копировать из под RAM ?

Вернутся из нее я уже не смогу, но смогу вызвать сброс...

 

 

Share this post


Link to post
Share on other sites

22 minutes ago, MKdemiurg said:

Вернутся из нее я уже не смогу, но смогу вызвать сброс...

Ну, так обычно и делают после обновления прошивки - soft reset ))

Share this post


Link to post
Share on other sites

27 minutes ago, MKdemiurg said:

Вот тут не понял - я же буду копировать из под RAM ?

Вернутся из нее я уже не смогу, но смогу вызвать сброс...

 

 

Скопировать не проблема, А вот что делать если у Вас половина запишется и произойдёт сброс ?
Получите кирпич. От этой ситации и пляшите.

Когда придумаете - всё остальное будет мелочью.

Расписывать лень, но сейчас набегут гуру программирования и накидают советов на вентилятор.

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