Перейти к содержанию
    

Как программно загнать STM32 в бутлоадер?

Достаточно весело. У вас в main есть такой цикл? Это я к тому что советуя передать переменную через память сквозь ресет, надо еще уточнить где и что задушить, чтобы человек не бился с 0 переменной как рыба об лед.

main() это главная программа в С.

Прежде чем до нее дойдет дело, переменные которые у вас объявлены, должны быть проинициализированы,

обработчики векторов установлены, стек пойнтер заряжен и так далее.

Обычно все это делает ассемлерная программка типично именуемая "startup" или похоже.

Она то и располагается по ресет вектору. Все сделает, обнулит озу, установит константы, а потом перейдет на мейн.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сценарий.

перевели в обновление прошивки,

перезагрузка, определили что остаться в бутлоадере

начали грузить прошивку - сбой питания

старт после отключения питания и что будет с флажком и признаком перезагрузки?

Вы тысячу раз правы.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

main() это главная программа в С.

....

Обычно все это делает ассемлерная программка типично именуемая "startup" или похоже.

Она то и располагается по ресет вектору. Все сделает, обнулит озу, установит константы, а потом перейдет на мейн.

 

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

 

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

 

 

 

Цитата

сценарий.

перевели в обновление прошивки,

перезагрузка, определили что остаться в бутлоадере

начали грузить прошивку - сбой питания

старт после отключения питания и что будет с флажком и признаком перезагрузки?

Вы тысячу раз правы.

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

 

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

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

 

 

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

Можно, конечно, вопрос во всех ли процах есть флаг что ресет от сторожевика? Ну и опять же что делать если программа заработала, но не так как хотели?...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это понятно, у меня вопрос вы когда последний раз писали или хотя бы правили 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();
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если передавать флаг программного сброса через озу (например, совместно с WDT reset), то описано ли в каком нибудь документе то, что содержимое озу не портится во время reset ?

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

А ещё лучше - такой флаг передавать в той флешь, где передаётся прошивка. Зачем его в ОЗУ передавать-то???

 

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

 

Это понятно, у меня вопрос вы когда последний раз писали или хотя бы правили startup?

Я частенько его правлю. А что? Это такая-же часть ПО, как и все остальные.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, а я придумал как обойтись без флага.

Лично я вижу идеальный алгоритм такой:

1. Старт бутлодера

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

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

3. Нет запроса по USART - делаем проверку - вдруг прошивка бита, а мужики-то не знают... Проверяем прошивку и если там беда - остаемся в бутлодере и, скажем, мигаем светодиодом.

 

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

 

Может быть в моих рассуждениях есть изъян?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

От контроллера требуется только две вещи - в бутлодере - понять, что нужно прошиваться, в основной программе - понять, что нужно перезагрузиться.
Вот вы и докопались до сути, отсеяв шелуху. Основная программа может понять по команде "начинаем обновлять прошивку" извне, а загрузчик - по флагу "программный сброс" в регистре RCC->CSR. И не нужны никакие дополнительные кнопки и паузы ожидания после включения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот вы и докопались до сути, отсеяв шелуху. Основная программа может понять по команде "начинаем обновлять прошивку" извне, а загрузчик - по флагу "программный сброс" в регистре RCC->CSR. И не нужны никакие дополнительные кнопки и паузы ожидания после включения.

 

Неправда ваша.

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

 

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

У меня ситуация еще сложнее - ни одна собачья упряжке не угонится за вращающейся деталью, на которой закреплен контроллер))

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бутлодер информацию о том, что нужно перепрошиться, никогда не получит.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Ну не суть важно, работающий у меня пример от ST содержит фрагмент, который вроде бы проверяет контрольную сумму.

Вы мне объясните, предложенный мной механим позволит обойтись без флагов во Flash?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Представьте себе, что был сбой птания при перепрошивке. Флага не будет. Основной программе кранты. Бутлодер информацию о том, что нужно перепрошиться, никогда не получит. Спасет только упомянутая выше собачья упряжка. То есть Ваш вариант абсолютно не предусматривает битой прошивки.
У меня этот вариант прекрасно работает и со сбоями питания и с разрывами связи. Разумеется, после сброса без флага (по собаке или включению питания) загрузчик проверяет целостность приложения и если CRC не сходится - он сам ожидает повторную команду "начинаем обновление". Кроме этой команды еще он может ответить нулем на запрос "какая в этом устройстве версия прошивки?" т.е. сообщить, что приложение поломано и необходимо обновление. Больше от него ничего не требуется. Ему не нужны ни флаги во флеш, ни флаги в ОЗУ. Приложению о нем тоже ничего знать не нужно, от приложения требуется только сделать программный сброс по команде "обновляемся". Система проста и надежна как трехлинейная винтовка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

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

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

 

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

Да кнопка не удобно, да надо идти к устройству, но все же это надежно на 150% что бы вы ни сделали, а кнопка останется. Правда, есть еще вариант затирания бутлоадера из основной программы :), но на этот случай у нас кнопка встроенного загрузчика и уарт выведен..

Мы старались обеспечить максимум возможностей чтобы пользователь в итоге не остался с неработающим устройством в ожидании специалистов с другого края света с приборами для смены прошивки... Особо любимые клиенты с интернетом решат свои проблемы в течение часа%)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Вы мне объясните, предложенный мной механим позволит обойтись без флагов во Flash?

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

 

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

А для таких случаев делаем режим recovery по кнопке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...