Кто-то пробовал STM32 самопрошивать из главного кода, а не по буту?

Статус: Offline
Реєстрація: 17.08.2005
Повідом.: 49228
Кто-то пробовал STM32 самопрошивать из главного кода, а не по буту?

Задался интересным вопросом - все для обновления юзают перезагрузку с зажатым бутом...
Ну стандартный подход, ок. А кто-то пробовал делать вход в лоадер из основной программы?

Там какое дело... практически, если лоад с носителя, или по воздуху - дважды зашиваются копии кода для периферии.
Один раз USB-host|радиоканал - в бут секции, и потом ещё раз - уже в главной, если она с ними работает.

Вопрос в чем - как правильно сделать это один раз? К примеру, инит USB покласть в бут-секцию и в основном коде хардкодить параметром (из того же бутлоадера) адрес ссылки на неё.

По идее, если тип данных будет совпадать - такое обращение возможно. Бутлоадер точно знает где лежит что. И оно там будет лежать всегда. Он передаст абсолютно валидный адрес.

Тогда в основной секции не надо будет второй раз инитить эту срань.

Как вам такое, Илоны Маски?
 
Делал свой кастомный бут. Он всегда стартует по ресету и если не находит на внешнем НАНД образа прошивки передает управление приложению.

P.S. Вот жменька запятых, расставьте сами ,,,,,,,
 
Делал свой кастомный бут. Он всегда стартует по ресету и если не находит на внешнем НАНД образа прошивки передает управление приложению.

P.S. Вот жменька запятых, расставьте сами ,,,,,,,

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

Основная задумка - ту периферию, которая используется в буте - использовать и из приложения. Чтоб не дублировать код.
Бут будет меньше. код будет меньше за счет использования функций бута.
 
P.S. просто жаба давит - красивый жирный бутлодырь только на ините жрёт 70% от того, что жрёт само приложение.
Вот и думаю - а ну его нахуй.
 
Можно это как то обернуть в библиотеку и вывести АПИ через хидер. Так, например, сделан доступ к блютуз стеку в Нордиках. Он шьется по фиксированному адресу а из апликухи можно к нему доступиться. Но как это сделать хз.
Проще взять камень пожирнее или оптимизацию включить на полную.
 
Можно это как то обернуть в библиотеку и вывести АПИ через хидер. Так, например, сделан доступ к блютуз стеку в Нордиках. Он шьется по фиксированному адресу а из апликухи можно к нему доступиться. Но как это сделать хз.
Проще взять камень пожирнее или оптимизацию включить на полную.

Полностью включеній FATFS на USB и SDIO - 100+кБ
Правда, в бутлодыре всё включать не обязательно. Но всё равно 77кБ
 
Блядь, STM поломал генерацию для Keil :)
Продвигают свою IDE
 
В принципе, оптимизация его удавила в 3, практически, раза. Жаба всё не отставала.
 
Можно, вообще, указать функции по какому адресу её расположить? Ну как в AVR - cseg.

С переменными работать будет, так как есть
AREA |.ARM.__AT_0xFFE0|, CODE, READONLY

А функцию как запихать по адресу?
 
Программный вход в factory бут некоторые делают - достаточно немного регистры и настройки подмарафетить. Это можно сделать инициировав программный сброс. А по сбросу проверять ячейку RAM чтобы узнать кто сброс сделал, при необходимости передавать управление в factory бут. Но выходить прийдется аппаратным сборосом.

А использовать фрагменты кода из factory бута дело стремное - этот код может меняться в разных ревизиях чипов и у разных производителей.
 
Программный вход в factory бут некоторые делают - достаточно немного регистры и настройки подмарафетить. Это можно сделать инициировав программный сброс. А по сбросу проверять ячейку RAM чтобы узнать кто сброс сделал, при необходимости передавать управление в factory бут. Но выходить прийдется аппаратным сборосом.

А использовать фрагменты кода из factory бута дело стремное - этот код может меняться в разных ревизиях чипов и у разных производителей.

Нуэто как-то уж очень жестоко... И рамы должно хватить на весь загружаемый кусок. А её де-факто меньше, чем флэш. 192 vs 512

вообще, флэш в нём шьётся просто из программной секции. Стёр сектор - записал сектор. Важно чтобы в этот момент рабочими оставались либы, которые читают то, что шьёшь.

Вот и думаю - как поместить некую функцию в конец памяти. Вот чтобы все - в начале, а она - в конце. И инит периферии - в неё. По жиру - вообще всей, что есть. И потом не менять.

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

вообще, флэш в нём шьётся просто из программной секции. Стёр сектор - записал сектор. Важно чтобы в этот момент рабочими оставались либы, которые читают то, что шьёшь.

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

Тогда при ошибке или при потере питания при прошивке, контроллер сам будет вываливаться в бутлоадер.
 
если свой бутлоадер, то можно просто одну страницу под него зарезервировать и не перешивать её.
А я ж о чём! Вот как рассказать линкеру куда мне положить эту функцию? Я ж хочу, ятобы вся прога компилировалась вместе и бутлоадер с инициализацией и либами включить туда.
Пусть там 40кБ лежит - но они в любом случае будут лежать, так как весь код их использует.

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

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

Зависит от компилятора. Для GCC в *.ld файле прописать.
 
Задался интересным вопросом - все для обновления юзают перезагрузку с зажатым бутом...
Ну стандартный подход, ок. А кто-то пробовал делать вход в лоадер из основной программы?
Я делал на TMS320F28335 в бутлоадере подобное
в нужное время дергал из прошивки самописный бутлоадер - который уже инитил бутлоадер и его запускал, позволяя в любой момент сделать обновление. Работало.
по идде, не должно быть проблем с этим подходом и с стм32
 
Задался интересным вопросом - все для обновления юзают перезагрузку с зажатым бутом...
Ну стандартный подход, ок. А кто-то пробовал делать вход в лоадер из основной программы?
Пробовал использовать ресурсы бутлоадера из основной программы. В частности - массив символов знакогенератора.
Вызывать процедуры бутлоадера не пробовал, но, думаю, схема будет та же - в бутлоадере сохраняем адреса всего, что надо(в укромном месте), в основной программе - восстанавливаем оттуда же.
 
Пробовал использовать ресурсы бутлоадера из основной программы. В частности - массив символов знакогенератора.
Вызывать процедуры бутлоадера не пробовал, но, думаю, схема будет та же - в бутлоадере сохраняем адреса всего, что надо(в укромном месте), в основной программе - восстанавливаем оттуда же.

Хороший способ.
Бут тогда надо либой подключать, но как-то запрещать компилировать её.
Или дефайнить адреса как void (что очень любит ST) и потом принудительно назначать тип своим указателям (что тоже постоянно делает ST)?
 
Хороший способ.
Бут тогда надо либой подключать, но как-то запрещать компилировать её.
Или дефайнить адреса как void (что очень любит ST) и потом принудительно назначать тип своим указателям (что тоже постоянно делает ST)?
Бутлоадер у меня вообще в отдельном проекте. Один раз скомпилировал, прошил и забыл.
 
Назад
Зверху Знизу