Jump to content
    

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

49 минут назад, jcxz сказал:

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

Это ко мне вопрос? Когда как. Вот сейчас прорабатываю разработку изделия по стороннему ТЗ)) В котором ворох требований к ПО и его обновлению.

Разумеется, когда я сам пишу ТЗ, я упрощаю где можно упростить, усложняю там где нужно усложнить)

Share this post


Link to post
Share on other sites

2 hours ago, Arlleex said:

Я у себя в проектах загрузчиков, где RAM мало, чтобы туда всю программу не копировать, разделил исходники на "only-ROM execution" и "only-RAM execution" с соответственной линковкой по файлам.

Соответственно, вся инициализация исполняется из ROM, остальное из RAM.

вот тут у меня затык сейчас.

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

Только получается, что собирать статически  надо весь SDK,  а не отдельные файлы.

Share this post


Link to post
Share on other sites

Никаких статических библиотек. Каким они тут вообще боком.

Просто пишете скрипт линкера с секциями размещения в ROM и RAM для нужных файлов.

Компоновщик при линковке поместит функции из того или иного файла исходного кода куда надо - в ROM или RAM.

Share this post


Link to post
Share on other sites

3 hours ago, Forger said:

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

Сам бут не имеет права перешивать себя .

вот это скорее самый лучший вариант.

 

4 minutes ago, Arlleex said:

Никаких статических библиотек. Я не понимаю, каким они тут вообще боком.

Просто пишете скрипт линкера с секциями размещения в ROM и RAM для нужных файлов.

Компоновщик при линковке поместит функции из того или иного файла исходного кода куда надо - в ROM или RAM.

можете скинуть пример?

Я ещё не достиг этого уровня познания линкер-скриптов.

Как мне в скрипте указать какой фаил куда пихать? Или это в мейкфайле надо делать?

Я могу просто целую папку с CMSIS и SDK  запихать по секциям?

Share this post


Link to post
Share on other sites

Пример вне контекста проекта я придумать не могу, а проект скидывать я не могу. К тому же у Вас GCC, а у меня ARM CLang.

А скрипт примерно такой

LOADREG 0x08000000 8192
{
  ROOTREG 0x08000000 8192
  {
    *(InRoot$$Sections)
    startup.o     (RSTDATA, +First)
    startup.o     (RSTCODE)
    stm32f0xx_*.o (+RO)
    hwrom.o       (+RO)
    hwram.o       (romfunc)
  }
  
  RAM1REG 0x20000000 180
  {
    startup.o (VTBL, +First)
  }
  
  RAM2REG 0x200000B4 UNINIT 12
  {
    hwrom.o (.bss.blinf)
  }
  
  RAM3REG 0x200000C0 8000
  {
    hwrom.o (ramfunc)
    .ANY    (+RO, +RW, +ZI)
  }
}


hwrom.c, hwram.c - это файлы с функциями, размещенными в ROM и RAM, соответственно.

Однако есть исключения, поэтому отдельно помечены секции romfunc для hwram и наоборот.

Share this post


Link to post
Share on other sites

4 часа назад, Arlleex сказал:

Я у себя в проектах загрузчиков, где RAM мало

У ТС вроде как - GD32F303. В котором её не так уж и мало. Имхо - для бута вполне достаточно. Если кубизмом не страдать.  :smile:

Так что - лучше не усложнять без реальной необходимости и копировать всё целиком.

Share this post


Link to post
Share on other sites

4 minutes ago, jcxz said:

Если кубизмом не страдать.

оч точный термин для популярного нынче заболевания 🤣

Share this post


Link to post
Share on other sites

10 minutes ago, jcxz said:

У ТС вроде как - GD32F303. В котором её не так уж и мало. Имхо - для бута вполне достаточно. Если кубизмом не страдать.  :smile:

Так что - лучше не усложнять без реальной необходимости и копировать всё целиком.

Кубизмом не пострадаешь.

Тут СДК от китайцев - ниже LL библиотек STM. Просто обёртки над регистрами.

И то я в нём не уверен.

Целиком копировать загрузчик в RAM?

Этож мне его и собрать надо относительно адреса 0x2000000?

Вот тут мне не особо понятно, когда говорят про "полностью в RAM"

 

 

Share this post


Link to post
Share on other sites

1 minute ago, MKdemiurg said:

Целиком копировать загрузчик в RAM?

А почему его нельзя запускать из флэши?

И что произойдет, если в процессе обновления пройдет какой-то сбой? 100% кирпич?

Share this post


Link to post
Share on other sites

1 minute ago, Forger said:

А почему его нельзя запускать из флэши?

И что произойдет, если в процессе обновления пройдет какой-то сбой? 100% кирпич?

да, я уже выбрал вариант как вы предложили. суббутлоадер, бутлоадер , область для копирования, область для приложения.

Мне просто для себя понять - как я могу отправить приложение в RAM , если оно собрано по адресу 0x800000?

Share this post


Link to post
Share on other sites

14 minutes ago, MKdemiurg said:

как я могу отправить приложение в RAM

А зачем его отправлять в RAM? Не понимаю, чем FLASH не устраивает?

 

Share this post


Link to post
Share on other sites

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

Этож мне его и собрать надо относительно адреса 0x2000000?

Конечно. Укажите компоновщику регион ОЗУ как целевой для исполнения.

49 минут назад, Forger сказал:

А почему его нельзя запускать из флэши?

Если реализовывать безопасно обновляемый загрузчик, то компонуется он для исполнения из ОЗУ. А потом -  просто 2 разные области хранения его во флешь.

49 минут назад, Forger сказал:

И что произойдет, если в процессе обновления пройдет какой-то сбой? 100% кирпич?

После перезапуска, простейший код (необновляемый; можно назвать его "суб-загрузчик") выберет нужную копию загрузчика в одном из регионов флешь, скопирует в ОЗУ и передаст ей управление.

Обновление загрузчика всегда идёт в его неактивную копию. А компоновка для исполнения в ОЗУ позволяет не создавать два разных образа загрузчика для выполнения из 2-х разных регионов памяти. Вот почему "целиком в ОЗУ". Иначе придётся возиться с настройкой перемещаемого (relocatable) кода

Выше Arlleex уже описывал этот процесс. И где-то ещё неск.лет назад я тоже описывал.

Share this post


Link to post
Share on other sites

7 minutes ago, jcxz said:

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

Как я понял, речь шла не о загрузчике:

45 minutes ago, MKdemiurg said:

как я могу отправить приложение в RAM

 

Share this post


Link to post
Share on other sites

4 hours ago, jcxz said:

Обновление загрузчика всегда идёт в его неактивную копию. А компоновка для исполнения в ОЗУ позволяет не создавать два разных образа загрузчика для выполнения из 2-х разных регионов памяти. Вот почему "целиком в ОЗУ". Иначе придётся возиться с настройкой перемещаемого (relocatable) кода

Выше Arlleex уже описывал этот процесс. И где-то ещё неск.лет назад я тоже описывал.

Я пока склоняюсь к промежуточной части.

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

Хотя вариант с целым загрузчиком для ОЗУ - тоже мне нравится.

А как лучше? Получается , всё зависит только от того сколько озу...

 

ЗЫ А зачем тогда две копии? И что делать с копией прежней ревизии? Перетирать ? Мы же не можем откатится назад...Или отдать это решение на кастомную бизнес логику?

 

Share this post


Link to post
Share on other sites

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

валидирует загрузчик по фиксированному адресу и прыгает туда.

Что такое "валидирует" и что такое "фиксированный адрес"? Где? В ОЗУ во флешь?

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

ЗЫ А зачем тогда две копии?

Две копии - для безопасного обновления, естественно.

PS: Сдаётся мне - Вы ничего не поняли в алгоритме безопасного обновления загрузчика..... :unknw:

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