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

 
 
9 страниц V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> Как программно загнать STM32 в бутлоадер?
A. Fig Lee
сообщение Mar 11 2015, 01:35
Сообщение #76


Знающий
****

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



Цитата(Golikov A. @ Mar 10 2015, 16:38) *
Достаточно весело. У вас в main есть такой цикл? Это я к тому что советуя передать переменную через память сквозь ресет, надо еще уточнить где и что задушить, чтобы человек не бился с 0 переменной как рыба об лед.

main() это главная программа в С.
Прежде чем до нее дойдет дело, переменные которые у вас объявлены, должны быть проинициализированы,
обработчики векторов установлены, стек пойнтер заряжен и так далее.
Обычно все это делает ассемлерная программка типично именуемая "startup" или похоже.
Она то и располагается по ресет вектору. Все сделает, обнулит озу, установит константы, а потом перейдет на мейн.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 11 2015, 04:59
Сообщение #77


Местный
***

Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443



Цитата
сценарий.
перевели в обновление прошивки,
перезагрузка, определили что остаться в бутлоадере
начали грузить прошивку - сбой питания
старт после отключения питания и что будет с флажком и признаком перезагрузки?

Вы тысячу раз правы.
Кончено этоа проблема решается своеобразным костылем - можно сделать два признака перепрошивки - один - это флажок, устанавливаемый внутри основной программы, второй признак - это если перепрошить хочет компьютер. То есть запускаешь программу, включаешь устройство. Бутлодер видит отсутствие флажка, но по USART к нему поступают предложения руки и сердц- значит надо давать согласие)))

Вопрос - чисто для себя, представив, что ради флажка затирать целый сектор не очень хочется. Можно ли запускать в бутлодере сторожевой таймер, а проверять его в основной программе? Если основная программа не заработала, то сторожевой таймер инициирует перепрошивку?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 11 2015, 06:12
Сообщение #78


Гуру
******

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



Цитата
main() это главная программа в С.
....
Обычно все это делает ассемлерная программка типично именуемая "startup" или похоже.
Она то и располагается по ресет вектору. Все сделает, обнулит озу, установит константы, а потом перейдет на мейн.


Это понятно, у меня вопрос вы когда последний раз писали или хотя бы правили startup? Я так сейчас оглядываюсь года 3, если не 5 я к нему не притрагивался. А я еще заморачиваюсь, сейчас народ на Cube и прочие библиотеки смотрит все с большим удовольствием.

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



Цитата
сценарий.
перевели в обновление прошивки,
перезагрузка, определили что остаться в бутлоадере
начали грузить прошивку - сбой питания
старт после отключения питания и что будет с флажком и признаком перезагрузки?
Вы тысячу раз правы.
Кончено этоа проблема решается своеобразным костылем - можно сделать два признака перепрошивки - один - это флажок, устанавливаемый внутри основной программы, второй признак - это если перепрошить хочет компьютер. То есть запускаешь программу, включаешь устройство. Бутлодер видит отсутствие флажка, но по USART к нему поступают предложения руки и сердц- значит надо давать согласие)))

Цитата
Вопрос - чисто для себя, представив, что ради флажка затирать целый сектор не очень хочется.

если уж очень жаба душить затереть один из 15 неиспользуемых секторов, то можно поставить внешнюю FRAM:) маленькую, заодно там и параметры настроек хранить удобнее.


Цитата
Можно ли запускать в бутлодере сторожевой таймер, а проверять его в основной программе? Если основная программа не заработала, то сторожевой таймер инициирует перепрошивку?

Можно, конечно, вопрос во всех ли процах есть флаг что ресет от сторожевика? Ну и опять же что делать если программа заработала, но не так как хотели?...
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 11 2015, 06:58
Сообщение #79


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Mar 11 2015, 09:12) *
Это понятно, у меня вопрос вы когда последний раз писали или хотя бы правили startup? Я так сейчас оглядываюсь года 3, если не 5 я к нему не притрагивался.

Забавно. Я новую программу всегда начинаю с написания стартапа. Страшно подумать: там целых 11 строчек!
Код
#include <string.h>

extern char __etext, __data_start__, __data_end__, __bss_start__, __bss_end__;
extern int main();

void __attribute((used)) Reset_Handler(void)
{
        memcpy(&__data_start__, &__etext, &__data_end__ - &__data_start__); // copy-init variables
        memset(&__bss_start__, 0, &__bss_end__ - &__bss_start__); // zero-init variables
        (void)main();
}
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 11 2015, 07:04
Сообщение #80


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(swisst @ Mar 10 2015, 19:20) *
если передавать флаг программного сброса через озу (например, совместно с WDT reset), то описано ли в каком нибудь документе то, что содержимое озу не портится во время reset ?

С этим надо быть очень осторожным. Для передачи каких-либо данных через какой-либо метод сброса, нужно изучить мануал на МК. И думаю лучше использовать какие-то регистры периферии, для которых в мануле гарантируются дефолтные значения после включения питания и сохранение значения после сброса (типа регистров RTC).
А ещё лучше - такой флаг передавать в той флешь, где передаётся прошивка. Зачем его в ОЗУ передавать-то???

Не забывайте, что сразу после сброса в МК может запускаться сначала не ваше ПО, а какой-то ROM-загрузчик, который для своей работы тоже использует память (портит её).

Цитата(Golikov A. @ Mar 11 2015, 12:12) *
Это понятно, у меня вопрос вы когда последний раз писали или хотя бы правили startup?

Я частенько его правлю. А что? Это такая-же часть ПО, как и все остальные.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 11 2015, 07:26
Сообщение #81


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В мк есть куча регистров, управляющих периферией. Найдите ненужный, который не устанавливается после сброса в определенное состояние, и пользуйтесь.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 11 2015, 07:27
Сообщение #82


Местный
***

Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443



Господа, а я придумал как обойтись без флага.
Лично я вижу идеальный алгоритм такой:
1. Старт бутлодера
2. Проверка, не стучится ли комп по USART с предложением перепрошивки. Запуск функции прошивания в бутлодере по требованию компа - это на случай, если мы имеем битую прошивку, отсутствующий по этой причине флаг перепрошивки и бутлодер, который не ведая о беде, завершает свою работу и посылает контроллер по адресу битой прошивки.
В этом случае мы используем одну и ту же кодовую команду USART - если ее словил бутлодер - запускаем прошивание, если ее словила основная программа то она инициирует перезагрузку. Заметьте - без всяких флагов. Уж если на компе запущен софт, шлющий по USAR запрос о перепрошивке, то бутлодер тоже словит эту команду.
3. Нет запроса по USART - делаем проверку - вдруг прошивка бита, а мужики-то не знают... Проверяем прошивку и если там беда - остаемся в бутлодере и, скажем, мигаем светодиодом.

P.S. Кстати, вот только сейчас задумался, а почеу это мы так зациклились на этом флаге? Он нужен был бы в том случае, если бы решение о необходимости прошивки принимал сам контроллер. Но ведь принимает его человек. И человек запускает на компе программу, а программу можно настроить как душе угодно. От контроллера требуется только две вещи - в бутлодере - понять, что нужно прошиваться, в основной программе - понять, что нужно перезагрузиться.

Может быть в моих рассуждениях есть изъян?
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 11 2015, 08:07
Сообщение #83


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Salamander @ Mar 11 2015, 10:27) *
P.S. Кстати, вот только сейчас задумался, а почеу это мы так зациклились на этом флаге? Он нужен был бы в том случае, если бы решение о необходимости прошивки принимал сам контроллер. Но ведь принимает его человек. И человек запускает на компе программу, а программу можно настроить как душе угодно. От контроллера требуется только две вещи - в бутлодере - понять, что нужно прошиваться, в основной программе - понять, что нужно перезагрузиться.

Удалённая перепрошивка. Представьте, что устройство на далёком объекте и подключено к Ethernet. Ехать к нему надо на вертолётах, оленях и собачьих упряжках. Вот там флаги и нужны.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 11 2015, 08:14
Сообщение #84


Гуру
******

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



Цитата(Salamander @ Mar 11 2015, 09:27) *
От контроллера требуется только две вещи - в бутлодере - понять, что нужно прошиваться, в основной программе - понять, что нужно перезагрузиться.
Вот вы и докопались до сути, отсеяв шелуху. Основная программа может понять по команде "начинаем обновлять прошивку" извне, а загрузчик - по флагу "программный сброс" в регистре RCC->CSR. И не нужны никакие дополнительные кнопки и паузы ожидания после включения.


--------------------
На любой вопрос даю любой ответ
"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
Salamander
сообщение Mar 11 2015, 08:42
Сообщение #85


Местный
***

Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443



Цитата(Сергей Борщ @ Mar 11 2015, 11:14) *
Вот вы и докопались до сути, отсеяв шелуху. Основная программа может понять по команде "начинаем обновлять прошивку" извне, а загрузчик - по флагу "программный сброс" в регистре RCC->CSR. И не нужны никакие дополнительные кнопки и паузы ожидания после включения.


Неправда ваша.
Представьте себе, что был сбой птания при перепрошивке. Флага не будет. Основной программе кранты. Бутлодер информацию о том, что нужно перепрошиться, никогда не получит. Спасет только упомянутая выше собачья упряжка. То есть Ваш вариант абсолютно не предусматривает битой прошивки. Бутлодер на мой взгляд должен знать, что в основную программу лезть нельзя, а еще должен уметь запустить прошивку ориентируюсяь не на внутренние флги, а на команды извне.

Цитата
Удалённая перепрошивка. Представьте, что устройство на далёком объекте и подключено к Ethernet. Ехать к нему надо на вертолётах, оленях и собачьих упряжках. Вот там флаги и нужны.

У меня ситуация еще сложнее - ни одна собачья упряжке не угонится за вращающейся деталью, на которой закреплен контроллер))
Мой предыдущий абзац справедлив по отношению к вашим словам тоже. Гарантированность флагов не 100%. В то же время есть Ethernet, по которму мы переправляем прошивку, почему бы не направлять поэтому каналу команды и не сделать бутлодер посговорчивей. Посмотрим также на это с другой стороны - если озвученный мной механизм реализован, то какая надобность во флагах?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 11 2015, 08:52
Сообщение #86


Гуру
******

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



Цитата(Salamander @ Mar 11 2015, 11:42) *
Бутлодер информацию о том, что нужно перепрошиться, никогда не получит.

Любой вменяемый бут обязан посчитать CRC основной программы перед стартом.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 11 2015, 09:07
Сообщение #87


Местный
***

Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443



Цитата(aaarrr @ Mar 11 2015, 11:52) *
Любой вменяемый бут обязан посчитать CRC основной программы перед стартом.

Ох... опять по кругу. Я же уже писал выше, что исхожу из замечания человека, сомневаться в компетенции которого не имею морального права. А именно - товарищ Golikov A писал
Цитата
а дальше как биты лягут, пойдет такое дело и окажется битая прошивка с нормальным кодом и контрольной суммой, и вот вам здрасте приехали - кирпич.


Ну не суть важно, работающий у меня пример от ST содержит фрагмент, который вроде бы проверяет контрольную сумму.
Вы мне объясните, предложенный мной механим позволит обойтись без флагов во Flash?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 11 2015, 09:44
Сообщение #88


Гуру
******

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



Цитата(Salamander @ Mar 11 2015, 10:42) *
Представьте себе, что был сбой птания при перепрошивке. Флага не будет. Основной программе кранты. Бутлодер информацию о том, что нужно перепрошиться, никогда не получит. Спасет только упомянутая выше собачья упряжка. То есть Ваш вариант абсолютно не предусматривает битой прошивки.
У меня этот вариант прекрасно работает и со сбоями питания и с разрывами связи. Разумеется, после сброса без флага (по собаке или включению питания) загрузчик проверяет целостность приложения и если 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
Golikov A.
сообщение Mar 11 2015, 09:56
Сообщение #89


Гуру
******

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



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

А если езернет и на далекой планете, то какой таймаут надо дело чтобы гарантированно бутлоадер словил пакет начала перепрошивки? Пинги бывают крайне долгими. И если не хочется ждать долгую паузу на принятие решения - то флаг надежнее...

Цитата
Любой вменяемый бут обязан посчитать CRC основной программы перед стартом.

Цитата
И не нужны никакие дополнительные кнопки и паузы ожидания после включения.

И вот тут у меня есть поучительная история, в ходе каких-то тестов и разбирательств, закоментили функцию старта бутлоадера из основной программы, и прошили эту прошивку, дальше что?

Зачем мы делаем удаленную смену прошивки? На случай возможных ошибок, я так понимаю это в 95% случаев. Есть конечно варианты модернизации, но все же исправление ошибок по мне более вероятный сценарий. И почему мы тогда исключаем добавление новых ошибок во время исправления старых?
Да кнопка не удобно, да надо идти к устройству, но все же это надежно на 150% что бы вы ни сделали, а кнопка останется. Правда, есть еще вариант затирания бутлоадера из основной программы sm.gif, но на этот случай у нас кнопка встроенного загрузчика и уарт выведен..
Мы старались обеспечить максимум возможностей чтобы пользователь в итоге не остался с неработающим устройством в ожидании специалистов с другого края света с приборами для смены прошивки... Особо любимые клиенты с интернетом решат свои проблемы в течение часа%)

Но тут все как всегда не четко, всегда есть компромиссы, в нашем случае такой вариант показался наиболее правильным.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 11 2015, 09:59
Сообщение #90


Гуру
******

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



Цитата(Salamander @ Mar 11 2015, 12:07) *
Ох... опять по кругу. Я же уже писал выше, что исхожу из замечания человека, сомневаться в компетенции которого не имею морального права. А именно - товарищ Golikov A писал

Дальше он писал про метеорит. Считайте тогда MD5 и забудьте навсегда о проблеме.

Цитата(Salamander @ Mar 11 2015, 12:07) *
Вы мне объясните, предложенный мной механим позволит обойтись без флагов во Flash?

Позволит, работоспособен, но пользоваться загрузчиком, синхронизирующимся с чем-то на ПК, крайне неудобно. Сам когда-то пользовался подобным. Загрузчик должен точно знать, что нужна перепрошивка, а не выяснять это через внешний интерфейс.

Цитата(Golikov A. @ Mar 11 2015, 12:56) *
И вот тут у меня есть поучительная история, в ходе каких-то тестов и разбирательств, закоментили функцию старта бутлоадера из основной программы, и прошили эту прошивку, дальше что?

А для таких случаев делаем режим recovery по кнопке.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th July 2025 - 02:37
Рейтинг@Mail.ru


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