|
|
  |
STM32 flash, помогите разобраться |
|
|
|
Jul 10 2014, 11:36
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(A. Fig Lee @ Jul 10 2014, 14:08)  Что значит "уходит в цикл и кирпич"? ПО РЕСЕТУ МЫ ВСЕГДА ПОПАДАЕМ в БУТЛОАДЕР! И что? А без дополнительных телодвижений мы из бутлодера уходим в прошивку. А про телодвижения было расписано по четыре раза на предыдущих страницах - какие и зачем. Вот возьмите и прочитайте. И не пытайтесь впарить мне как открытие решение, которое я давно использую и которое описал на предыдущих страницах (уже, похоже, не один раз описал). Цитата(A. Fig Lee @ Jul 10 2014, 14:08)  ЗАЧЕМ ПРОВЕРЯТЬ КОНТРОЛЬНУЮ СУММУ ЕСЛИ ВСЕГДА МОЖНО ПЕРЕЗАЛИТЬ? Вы перезаливаете после каждого включения? Или у вас загрузчик все же при нормальном включении как-то определяет - запускать приложение или его там нет?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 10 2014, 12:02
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата(Golikov A. @ Jul 10 2014, 14:47)  То есть у него нет жестко прописываемой основной программы... Вряд ли... В этом случае логично было бы увидеть "всегда нужно перезаливать" вместо "всегда можно".
|
|
|
|
|
Jul 10 2014, 14:00
|

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

|
Цитата(Сергей Борщ @ Jul 10 2014, 07:36)  И что? А без дополнительных телодвижений мы из бутлодера уходим в прошивку. А про телодвижения было расписано по четыре раза на предыдущих страницах - какие и зачем. Вот возьмите и прочитайте. И не пытайтесь впарить мне как открытие решение, которое я давно использую и которое описал на предыдущих страницах (уже, похоже, не один раз описал). Вы перезаливаете после каждого включения? Или у вас загрузчик все же при нормальном включении как-то определяет - запускать приложение или его там нет? Ну понятно, что кнопка есть, если она нажата, мы в бутлодыре, если нет то улетаем на программу. Смысла в проверке контрольной суммы по прежнему нет. Всегда по ресету с кнопкой попадем в бутлодырь и будем сидеть до новой прошивки. Никаких кирпичей.. Я проверяю только примитив - если в начале лежит стекпойнтер 0x2000XXX. Правда, сейчас добавил EEPROM - бутлодырь если была заливка, прыгает на программу, если не было - проверяет ячейку на 0xFE, если там находит 0xFE, значит главная программа наш человек, прыгаем. Программа тоже проверяет на старте эту ячейку и пишет туда 0xFE, если там его нет. Особого смысла в этом нет, это больше для "технически одаренных" пользователей. Так легче объяснить, что "не играет", значит неправильную программу залил.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jul 10 2014, 18:15
|

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

|
Цитата(Golikov A. @ Jul 10 2014, 14:00)  Извращенная логика%  ... Забавно что вы не проверяете целостность прошивки. А если залилось что-то не так? А если флэш поврежден? Счастливые люди приборы которых не могут ничего испортить  ))... Бутлоадер может выдать контрольную сумму для диапазона аддрессов. Если флэш поврежден, то ничего не поможет. Контрольная сумма не спасает от повреждения. Там на 99.9% повреждения будут от неправильно написаной программы, чем по другим причинам. Но в принципе пойнт понятен. Спасибо
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jul 10 2014, 18:56
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Контрольная сумма не спасает от повреждения. Смотря повреждения чего  .. У меня одно устройство могло поднять тревогу и вызвать бригаду со стоимостью выезда 10-20 тысяч баксов. Если это бы произошло из-за того что прошивка неправильно записана во флэш мне бы сделали повреждение головы  . Другое устройство могло запустить систему пожаротушения основанную на шашках которые абсорбируют кислород, если бы оно это сделало в помещении с людьми оно бы их задушило Третье устройство могло поехать и ударить в дорогущий микроскоп дорогущим объектом. Во всех случаях я предпочту чтобы устройство не запустилось, чем сделало это...
|
|
|
|
|
Jul 11 2014, 07:39
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Я в "крупных" МК использую две области: application и image. Когда необходимо обновить прошивку, код, работающий в application (по сути сама программа) стирает image, получает и записывает image, проверяет CRC, версию железа и версию прошивки и после этого передает управление загрузчику (через SoftReset). До тех пор, или в случае некорректного/старого image программа работает и практически не чувствует, что идет какое-то обновление. Загрузчик проверяет корректность и версию как application, так и image. Если все CRC корректны и версия application >= версии image, то управление передается application. Если CRC у application не корректна, а у image корректна, то image расшифровывается и переписывается в application, как и в том случе, если версия image новее, затем перезагрузка. Если все CRC не корректны, то остаемся в загрузчике и мигаем светодиодом "SOS". Некоторые функции как подсчет CRC (в том числе на лету, по ходу выполнения программы), расшифровка и т.п. вынесены в область загрузчика и application их экспортирует по фиксированным адресам из таблицы экспорта (последние 240 байт загрузчика). Из бонусов image шифрованный, сложно получить кирпич, обновление мгновенное (минимально возможное время, т.к. основная часть тратится на передачу image по GPRS|SD-карты|RS485 и т.п., а application при этом работает). Из минусов: расход памяти практически удвоенный (но image можно держать во внешней медленной/последовательной памяти, т.к. он шифрован и не отличается от того, что передается Заказчику свободно в качестве обновления), загрузчик поддерживает лишь базовые варианты управления без возможности модернизации.
|
|
|
|
|
Jul 11 2014, 09:44
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Цитата И ради чего ваши жертвы? Ради экономии 20 байт и 10 мс на проверку CRC приложения? Я просто описал, как оно у меня щас сделано и не призываю делать так всех. Удалённого обновления на данный момент нет, поэтому и вышеописанные ужасы вряд ли произойдут. Когда удалённое обновление появится, то я буду проверять контрольную сумму каждого пакета и делать верификацию всей прошивки после заливки. И это будет происходить в отдельной области памяти, а не поверх рабочей прошивки.
|
|
|
|
|
Jul 11 2014, 18:31
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Ага%) Есть и на этот случай история у меня из раздела гусарских баллад. Был на фирме программист любил сделать код и не изнурял себя защитами. В случае не запуска на объекте он всегда был готово на обновления и не видел почему те кто на объекте так ругаются.
Вот в итоге люди на объекте устали и вызывали его на обновление в командировку. Он приехал с ноутбуком, программатором и говорит, ну где прибор, ща все исправим. Ему дали лопату, указали место и сказали: прибор на глубине 4 метров мерзлой глины под землей, выкопай его, достань и обнови, а потом там в яме его подключи так как туда выведена вся подводка и гермокапсула рабочая.
Уволился он....
Это я к тому что иногда нажать кнопку - равносильно получить кирпич. С другой стороны если уже все совсем пойдет не так, раз в год парни могут и выкопать прибор, им не западло, и если для его реанимации будет достаточно нажать кнопку, а не везти его в москву все скажут большое спасибо! На объектах разное бывает, взяли новичка в бригаду, он что-то не так сделал, залил фигню, прибор сдох...
Так что кнопка нужна, но на крайний случай...
|
|
|
|
|
Oct 20 2015, 05:32
|
Частый гость
 
Группа: Участник
Сообщений: 101
Регистрация: 28-04-06
Пользователь №: 16 592

|
Что-то пример от ST мня загоняет в ступор это процедура стирания флеша из исходника к AN3374 STM32F2xx in-application programming using the USART Код /** * @brief This function does an erase of all user flash area * @param StartSector: start of user flash area * @retval 0: user flash area successfully erased * 1: error occurred */ uint32_t FLASH_If_Erase(uint32_t StartSector) { uint32_t UserStartSector = FLASH_Sector_1, i = 0;
/* Get the sector where start the user flash area */ UserStartSector = GetSector(APPLICATION_ADDRESS);
for(i = UserStartSector; i <= FLASH_Sector_11; i += 8) { /* Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by word */ if (FLASH_EraseSector(i, VoltageRange_3) != FLASH_COMPLETE) { /* Error occurred while page erase */ return (1); } } return (0); } Зачем там i+=8 ? Ну i+=4 я бы еще как то понял, т.к. запись далее идет по 32 бита. Но сектор же стирается целиком ? Зачем вызывать процедуру стирания sectorlen/8 раз ?
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|