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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

44 minutes ago, MKdemiurg said:

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

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

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

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

 

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


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

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

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

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


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

1 hour ago, jcxz said:

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

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

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

GD32F303 CortexM4

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

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

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

3 minutes ago, Arlleex said:

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

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

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


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

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

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

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

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


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

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

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

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

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


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

1 hour ago, Forger said:

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

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

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

 

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

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


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

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

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

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

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

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


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

22 minutes ago, MKdemiurg said:

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

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

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

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

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

 

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


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

58 minutes ago, Arlleex said:

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

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

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

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

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

image.png.0702d1b078352fabc4779369173aff82.png

image.png.db48059e5a57b6e4537e53e894e89073.png

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

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

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

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

37 minutes ago, Forger said:

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

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

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

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

 

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

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


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

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

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

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

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

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


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

1 minute ago, jcxz said:

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

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

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

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

 

 

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


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

22 minutes ago, MKdemiurg said:

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

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

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


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

27 minutes ago, MKdemiurg said:

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

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

 

 

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

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

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

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


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

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

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

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

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

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

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

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

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

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