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

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

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

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

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

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

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


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

2 hours ago, Arlleex said:

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

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

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

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

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

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


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

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

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

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

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


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

3 hours ago, Forger said:

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

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

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

 

4 minutes ago, Arlleex said:

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

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

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

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

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

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

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

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


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

Пример вне контекста проекта я придумать не могу, а проект скидывать я не могу. К тому же у Вас 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 и наоборот.

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


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

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

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

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

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

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


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

4 minutes ago, jcxz said:

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

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

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


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

10 minutes ago, jcxz said:

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

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

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

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

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

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

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

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

 

 

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


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

1 minute ago, MKdemiurg said:

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

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

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

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


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

1 minute ago, Forger said:

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

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

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

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

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


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

14 minutes ago, MKdemiurg said:

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

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

 

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

7 minutes ago, jcxz said:

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

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

45 minutes ago, MKdemiurg said:

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

 

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


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

4 hours ago, jcxz said:

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

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

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

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

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

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

 

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

 

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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