реклама на сайте
подробности

 
 
7 страниц V  « < 4 5 6 7 >  
Reply to this topicStart new topic
> STM32 flash, помогите разобраться
Сергей Борщ
сообщение Jul 10 2014, 11:36
Сообщение #76


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 10 2014, 11:47
Сообщение #77


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А вот тут вдруг у меня возникло такое подозрение...

Может человек говорит про микробут или что-то типа.
То есть загрузчик который берет прошивку рабочую с СД карты или что-то типа того? То есть у него нет жестко прописываемой основной программы...
Go to the top of the page
 
+Quote Post
Axel
сообщение Jul 10 2014, 12:02
Сообщение #78


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(Golikov A. @ Jul 10 2014, 14:47) *
То есть у него нет жестко прописываемой основной программы...

Вряд ли... В этом случае логично было бы увидеть "всегда нужно перезаливать" вместо "всегда можно".
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 10 2014, 14:00
Сообщение #79


Знающий
****

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



Цитата(Сергей Борщ @ Jul 10 2014, 07:36) *
И что? А без дополнительных телодвижений мы из бутлодера уходим в прошивку. А про телодвижения было расписано по четыре раза на предыдущих страницах - какие и зачем. Вот возьмите и прочитайте. И не пытайтесь впарить мне как открытие решение, которое я давно использую и которое описал на предыдущих страницах (уже, похоже, не один раз описал).
Вы перезаливаете после каждого включения? Или у вас загрузчик все же при нормальном включении как-то определяет - запускать приложение или его там нет?


Ну понятно, что кнопка есть, если она нажата, мы в бутлодыре, если нет то улетаем на программу.
Смысла в проверке контрольной суммы по прежнему нет.
Всегда по ресету с кнопкой попадем в бутлодырь и будем сидеть до новой прошивки.
Никаких кирпичей..

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

Правда, сейчас добавил EEPROM - бутлодырь если была заливка, прыгает на программу,
если не было - проверяет ячейку на 0xFE, если там находит 0xFE, значит главная программа наш человек, прыгаем.
Программа тоже проверяет на старте эту ячейку и пишет туда 0xFE, если там его нет.

Особого смысла в этом нет, это больше для "технически одаренных" пользователей.
Так легче объяснить, что "не играет", значит неправильную программу залил.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 10 2014, 18:00
Сообщение #80


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Извращенная логика%sm.gif...

Забавно что вы не проверяете целостность прошивки. А если залилось что-то не так? А если флэш поврежден?
Счастливые люди приборы которых не могут ничего испортитьsm.gif))...

Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 10 2014, 18:15
Сообщение #81


Знающий
****

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



Цитата(Golikov A. @ Jul 10 2014, 14:00) *
Извращенная логика%sm.gif...

Забавно что вы не проверяете целостность прошивки. А если залилось что-то не так? А если флэш поврежден?
Счастливые люди приборы которых не могут ничего испортитьsm.gif))...


Бутлоадер может выдать контрольную сумму для диапазона аддрессов.
Если флэш поврежден, то ничего не поможет.
Контрольная сумма не спасает от повреждения.
Там на 99.9% повреждения будут от неправильно написаной программы, чем по другим причинам.

Но в принципе пойнт понятен. Спасибо


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 10 2014, 18:56
Сообщение #82


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Контрольная сумма не спасает от повреждения.

Смотря повреждения чегоsm.gif..
У меня одно устройство могло поднять тревогу и вызвать бригаду со стоимостью выезда 10-20 тысяч баксов. Если это бы произошло из-за того что прошивка неправильно записана во флэш мне бы сделали повреждение головыsm.gif.
Другое устройство могло запустить систему пожаротушения основанную на шашках которые абсорбируют кислород, если бы оно это сделало в помещении с людьми оно бы их задушило
Третье устройство могло поехать и ударить в дорогущий микроскоп дорогущим объектом.

Во всех случаях я предпочту чтобы устройство не запустилось, чем сделало это...
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jul 11 2014, 06:28
Сообщение #83


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Я в своём софте тоже проверяю только, что сектор не пустой перед прыжком, однако подход Golikov A. очень даже разумен для критических применений железа. На самом деле, повреждённый байт может привести к катастрофическим последствиям.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 11 2014, 06:46
Сообщение #84


Гуру
******

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



Ну что ж, идем на очередной круг. Не всегда есть возможность подойти и передернуть питание. Бывает, что обновление хочется сделать удаленно. И если во время такого обновления происходит сбой (связи), то с вашей проверкой на непустой сектор вы запустите нерабочее приложение и придется таки посылать человека жать на кнопку и передергивать питание. В моей и в Golikov A. реализации загрузчик обнаружит испорченное приложение и останется в режиме ожидания загрузки, давая возможность повторить загрузку. И ради чего ваши жертвы? Ради экономии 20 байт и 10 мс на проверку CRC приложения?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 11 2014, 07:39
Сообщение #85


Гуру
******

Группа: Свой
Сообщений: 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 можно держать во внешней медленной/последовательной памяти, т.к. он шифрован и не отличается от того, что передается Заказчику свободно в качестве обновления), загрузчик поддерживает лишь базовые варианты управления без возможности модернизации.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 11 2014, 09:15
Сообщение #86


Гуру
******

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



У меня обновление на лету. Тоже шифрование. Нет необходимости в дополнительной памяти. В случае сбоя обновления меня не напрягает повторить. Обновление через UART. Будет GPRS - буду думать.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jul 11 2014, 09:44
Сообщение #87


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Цитата
И ради чего ваши жертвы? Ради экономии 20 байт и 10 мс на проверку CRC приложения?

Я просто описал, как оно у меня щас сделано и не призываю делать так всех.
Удалённого обновления на данный момент нет, поэтому и вышеописанные ужасы вряд ли произойдут. Когда удалённое обновление появится, то я буду проверять контрольную сумму каждого пакета и делать верификацию всей прошивки после заливки. И это будет происходить в отдельной области памяти, а не поверх рабочей прошивки.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 11 2014, 11:33
Сообщение #88


Знающий
****

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



Цитата(Сергей Борщ @ Jul 11 2014, 02:46) *
Ну что ж, идем на очередной круг. Не всегда есть возможность подойти и передернуть питание. Бывает, что обновление хочется сделать удаленно. И если во время такого обновления происходит сбой (связи), то с вашей проверкой на непустой сектор вы запустите нерабочее приложение и придется таки посылать человека жать на кнопку и передергивать питание. В моей и в Golikov A. реализации загрузчик обнаружит испорченное приложение и останется в режиме ожидания загрузки, давая возможность повторить загрузку. И ради чего ваши жертвы? Ради экономии 20 байт и 10 мс на проверку CRC приложения?


Тем не менее: "придется таки посылать человека жать на кнопку" и "получаем кирпич" немного разные вещи


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 11 2014, 18:31
Сообщение #89


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Ага%) Есть и на этот случай история у меня из раздела гусарских баллад. Был на фирме программист любил сделать код и не изнурял себя защитами. В случае не запуска на объекте он всегда был готово на обновления и не видел почему те кто на объекте так ругаются.

Вот в итоге люди на объекте устали и вызывали его на обновление в командировку. Он приехал с ноутбуком, программатором и говорит, ну где прибор, ща все исправим. Ему дали лопату, указали место и сказали: прибор на глубине 4 метров мерзлой глины под землей, выкопай его, достань и обнови, а потом там в яме его подключи так как туда выведена вся подводка и гермокапсула рабочая.

Уволился он....

Это я к тому что иногда нажать кнопку - равносильно получить кирпич. С другой стороны если уже все совсем пойдет не так, раз в год парни могут и выкопать прибор, им не западло, и если для его реанимации будет достаточно нажать кнопку, а не везти его в москву все скажут большое спасибо! На объектах разное бывает, взяли новичка в бригаду, он что-то не так сделал, залил фигню, прибор сдох...

Так что кнопка нужна, но на крайний случай...
Go to the top of the page
 
+Quote Post
grv
сообщение Oct 20 2015, 05:32
Сообщение #90


Частый гость
**

Группа: Участник
Сообщений: 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 раз ?
Go to the top of the page
 
+Quote Post

7 страниц V  « < 4 5 6 7 >
Reply to this topicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016