|
Опять изобретать велосипед?, Bootloader STM32F103 IAR EEPROM. |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jun 15 2014, 09:55
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата(misyachniy @ Jun 15 2014, 11:30)  Какие именно недостатки? "Категорический" недостаток - невозможность апгрейда совместно используемых фрагментов. Остальное - просто дополнительные хлопоты по их размещению и интерфейсу.
|
|
|
|
|
Jun 15 2014, 11:28
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(Axel @ Jun 15 2014, 05:55)  "Категорический" недостаток - невозможность апгрейда совместно используемых фрагментов. Остальное - просто дополнительные хлопоты по их размещению и интерфейсу. Не только совместно используемых, основную программу тоже с оглядкой надо будет апгрейдить. Бутлоадер всегда должен быть полностью отдельным.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jun 15 2014, 16:27
|
Знающий
   
Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594

|
Проблема в том, что если вы откомпилируете с разными уровнями оптимизации кода или перейдете на новую версию компилятора, то точки входа в модули в бутлодере сползут и появится несовместимость версий и прочие беды. Если конечно функции привязать к конкретным адресам, то будет полегче, но все равно это будет неудобно. Отдельно делать банально легче технически. А хранить куски кода в бутлодере - правильно ли идеологически? - вы же как раз хотите обновлять код, а как это делать если все массивные части у вас будут залочены...
Бутлодер должен быть лаконичным, максимально надежным куском кода, который поднимет девайс из любого убитого состояния, который обновлять не будет нужно никогда. Например должно быть так: основная прошивка должна загрузить код по FTP в промежуточную память (конечно если она есть), а бутлодер уже из этой памяти взять код, проверить на целостность и уже потом прошить.
Сообщение отредактировал kan35 - Jun 15 2014, 16:29
|
|
|
|
|
Jun 16 2014, 04:52
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата(A. Fig Lee @ Jun 16 2014, 03:20)  Угу. А потом эта загруженная программа откажется работать. И прощай фтп Вполне вероятная перспектива. В реальности технология "Семь раз отмерь..." не всегда реализуема и перекладывание части функций загрузчика на основную программу (что, собственно, и предусматривает концепция "лаконичности") - прямой путь к неприятностям.
|
|
|
|
|
Jun 16 2014, 06:52
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
 Имеет право на жизнь и такой вариант, какой вы описали. Но он слишком хлопотный. Например в ПЛК сименс можно заменить даже отдельные процедуры. Причём прямо на лету. Правда при этом хранятся не только копии программ, но и копии данных. Требуется полное совпадение данных. Они определённым образом обезличены, по отношению к другим модулям. Ну и так далее ... Короче, если не готовы продумать все эти детали и подробности, то значительно проще, использовать независимый бут и независимое приложение. Пусть там что-то и будет дублироваться. В конечном итоге, работа бута состоит только в загрузке приложения. И он может быть даже неэфективным. Может годами не модифицироваться. Необходимо чтобы он просто выполнял свою функцию. А вот приложение, может непрерывно совершенствоваться.
|
|
|
|
|
Jun 19 2014, 16:10
|
Знающий
   
Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454

|
Взял пример AN2557 переделал прием данных по UART в чтение из EEPROM. Увеличил размер под bootloader в проекте bootloader-а Код #define ApplicationAddress 0x8004000 И подкорректировал stm32f10x_flash_offset.icfКод define symbol __ICFEDIT_region_ROM_start__ = 0x08004000; Скомпилировал пример и загрузил в EEPROM. bootloader корректно стирает Program memory, пишет в нее программу но не запускает приложение. Не проходит проверка: Код // Test if user code is programmed starting from address "ApplicationAddress" if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); } По ApplicationAddress у меня храняться байты 00 04 00 20Что переводиться в unsigned int как 0x20000400После наложения маски 0x20000000 условие должно выполняться и запускаться программа, но отладчик пропускает выполнеие и вываливается на конец программы while (1) {}Почему7
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|