Arlleex 56 March 20 Posted March 20 · Report post 49 минут назад, jcxz сказал: Чтобы его реализовать, его надо сперва написать. А в наших реалиях пишет его как правило тот же, кто и реализует потом. Надеюсь - Вы согласны? Это ко мне вопрос? Когда как. Вот сейчас прорабатываю разработку изделия по стороннему ТЗ)) В котором ворох требований к ПО и его обновлению. Разумеется, когда я сам пишу ТЗ, я упрощаю где можно упростить, усложняю там где нужно усложнить) Quote Share this post Link to post Share on other sites More sharing options...
MKdemiurg 0 March 20 Posted March 20 · Report post 2 hours ago, Arlleex said: Я у себя в проектах загрузчиков, где RAM мало, чтобы туда всю программу не копировать, разделил исходники на "only-ROM execution" и "only-RAM execution" с соответственной линковкой по файлам. Соответственно, вся инициализация исполняется из ROM, остальное из RAM. вот тут у меня затык сейчас. на сколько я понимаю мне надо создать статические либы , а потом притянуть их в линкере. Только получается, что собирать статически надо весь SDK, а не отдельные файлы. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 56 March 20 Posted March 20 · Report post Никаких статических библиотек. Каким они тут вообще боком. Просто пишете скрипт линкера с секциями размещения в ROM и RAM для нужных файлов. Компоновщик при линковке поместит функции из того или иного файла исходного кода куда надо - в ROM или RAM. Quote Share this post Link to post Share on other sites More sharing options...
MKdemiurg 0 March 20 Posted March 20 · Report post 3 hours ago, Forger said: Тогда как ранее описал - специальная прошивка, которая внутри содержит новый бут и при заливке сама его обновляет. Сам бут не имеет права перешивать себя . вот это скорее самый лучший вариант. 4 minutes ago, Arlleex said: Никаких статических библиотек. Я не понимаю, каким они тут вообще боком. Просто пишете скрипт линкера с секциями размещения в ROM и RAM для нужных файлов. Компоновщик при линковке поместит функции из того или иного файла исходного кода куда надо - в ROM или RAM. можете скинуть пример? Я ещё не достиг этого уровня познания линкер-скриптов. Как мне в скрипте указать какой фаил куда пихать? Или это в мейкфайле надо делать? Я могу просто целую папку с CMSIS и SDK запихать по секциям? Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 56 March 20 Posted March 20 · Report post Пример вне контекста проекта я придумать не могу, а проект скидывать я не могу. К тому же у Вас 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 и наоборот. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 82 March 20 Posted March 20 · Report post 4 часа назад, Arlleex сказал: Я у себя в проектах загрузчиков, где RAM мало У ТС вроде как - GD32F303. В котором её не так уж и мало. Имхо - для бута вполне достаточно. Если кубизмом не страдать. Так что - лучше не усложнять без реальной необходимости и копировать всё целиком. Quote Share this post Link to post Share on other sites More sharing options...
Forger 15 March 20 Posted March 20 · Report post 4 minutes ago, jcxz said: Если кубизмом не страдать. оч точный термин для популярного нынче заболевания 🤣 Quote Share this post Link to post Share on other sites More sharing options...
MKdemiurg 0 March 20 Posted March 20 · Report post 10 minutes ago, jcxz said: У ТС вроде как - GD32F303. В котором её не так уж и мало. Имхо - для бута вполне достаточно. Если кубизмом не страдать. Так что - лучше не усложнять без реальной необходимости и копировать всё целиком. Кубизмом не пострадаешь. Тут СДК от китайцев - ниже LL библиотек STM. Просто обёртки над регистрами. И то я в нём не уверен. Целиком копировать загрузчик в RAM? Этож мне его и собрать надо относительно адреса 0x2000000? Вот тут мне не особо понятно, когда говорят про "полностью в RAM" Quote Share this post Link to post Share on other sites More sharing options...
Forger 15 March 20 Posted March 20 · Report post 1 minute ago, MKdemiurg said: Целиком копировать загрузчик в RAM? А почему его нельзя запускать из флэши? И что произойдет, если в процессе обновления пройдет какой-то сбой? 100% кирпич? Quote Share this post Link to post Share on other sites More sharing options...
MKdemiurg 0 March 20 Posted March 20 · Report post 1 minute ago, Forger said: А почему его нельзя запускать из флэши? И что произойдет, если в процессе обновления пройдет какой-то сбой? 100% кирпич? да, я уже выбрал вариант как вы предложили. суббутлоадер, бутлоадер , область для копирования, область для приложения. Мне просто для себя понять - как я могу отправить приложение в RAM , если оно собрано по адресу 0x800000? Quote Share this post Link to post Share on other sites More sharing options...
Forger 15 March 20 Posted March 20 · Report post 14 minutes ago, MKdemiurg said: как я могу отправить приложение в RAM А зачем его отправлять в RAM? Не понимаю, чем FLASH не устраивает? Quote Share this post Link to post Share on other sites More sharing options...
jcxz 82 March 20 Posted March 20 · Report post 51 минуту назад, MKdemiurg сказал: Этож мне его и собрать надо относительно адреса 0x2000000? Конечно. Укажите компоновщику регион ОЗУ как целевой для исполнения. 49 минут назад, Forger сказал: А почему его нельзя запускать из флэши? Если реализовывать безопасно обновляемый загрузчик, то компонуется он для исполнения из ОЗУ. А потом - просто 2 разные области хранения его во флешь. 49 минут назад, Forger сказал: И что произойдет, если в процессе обновления пройдет какой-то сбой? 100% кирпич? После перезапуска, простейший код (необновляемый; можно назвать его "суб-загрузчик") выберет нужную копию загрузчика в одном из регионов флешь, скопирует в ОЗУ и передаст ей управление. Обновление загрузчика всегда идёт в его неактивную копию. А компоновка для исполнения в ОЗУ позволяет не создавать два разных образа загрузчика для выполнения из 2-х разных регионов памяти. Вот почему "целиком в ОЗУ". Иначе придётся возиться с настройкой перемещаемого (relocatable) кода Выше Arlleex уже описывал этот процесс. И где-то ещё неск.лет назад я тоже описывал. Quote Share this post Link to post Share on other sites More sharing options...
Forger 15 March 20 Posted March 20 · Report post 7 minutes ago, jcxz said: Если реализовывать безопасно обновляемый загрузчик, то компонуется он для исполнения из ОЗУ. Как я понял, речь шла не о загрузчике: 45 minutes ago, MKdemiurg said: как я могу отправить приложение в RAM Quote Share this post Link to post Share on other sites More sharing options...
MKdemiurg 0 March 20 Posted March 20 · Report post 4 hours ago, jcxz said: Обновление загрузчика всегда идёт в его неактивную копию. А компоновка для исполнения в ОЗУ позволяет не создавать два разных образа загрузчика для выполнения из 2-х разных регионов памяти. Вот почему "целиком в ОЗУ". Иначе придётся возиться с настройкой перемещаемого (relocatable) кода Выше Arlleex уже описывал этот процесс. И где-то ещё неск.лет назад я тоже описывал. Я пока склоняюсь к промежуточной части. Есть субзагрузчик. Всё что он делает - это проверяет нет ли новой версии загрузчика во временном хранилище и если нет - валидирует загрузчик по фиксированному адресу и прыгает туда. Если есть, то копирует новую версию на место загрузчика А уже в основном загрузчике валидация приложения и прыжок в приложение. Хотя вариант с целым загрузчиком для ОЗУ - тоже мне нравится. А как лучше? Получается , всё зависит только от того сколько озу... ЗЫ А зачем тогда две копии? И что делать с копией прежней ревизии? Перетирать ? Мы же не можем откатится назад...Или отдать это решение на кастомную бизнес логику? Quote Share this post Link to post Share on other sites More sharing options...
jcxz 82 March 20 Posted March 20 · Report post 30 минут назад, MKdemiurg сказал: валидирует загрузчик по фиксированному адресу и прыгает туда. Что такое "валидирует" и что такое "фиксированный адрес"? Где? В ОЗУ во флешь? 30 минут назад, MKdemiurg сказал: ЗЫ А зачем тогда две копии? Две копии - для безопасного обновления, естественно. PS: Сдаётся мне - Вы ничего не поняли в алгоритме безопасного обновления загрузчика..... Quote Share this post Link to post Share on other sites More sharing options...