Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как программно загнать STM32 в бутлоадер?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3
ViKo
Цитата(Salamander @ Mar 8 2015, 21:25) *
а я хотел бы еще так для себя поинтересоваться, а если в процессе компиляции компилятор присвоит какой-либо переменной некий адрес, а потом я в конце захочу указанным атрибутом этот же адрес присвоить другой переменной? Что будет? Или компилятор в первую очередь распределяет явно указанные адреса?

Если конкретный адрес задан, то компилятор туда ничего от себя не поместит.
aaarrr
Цитата(Salamander @ Mar 8 2015, 17:43) *
Как мне в основной программе записать флажок, чтобы этот флажок был виден в бутлодыре?

Флажка тут мало: он может и случайно оказаться равен 1. Используйте 32 битное слово с каким-нибудь нетривиальным значением.
Передать есть несколько способов (в порядке нарастания сложности):
1. Записать в какой-нибудь периферийный scratchpad-регистр (скажем, регистры ключа AES у вашего процессора).
2. "Спрятать" кусочек RAM от линкера, и писать-читать по указателю.
3. Определить честную секцию с фиксированным адресом для хранения флага. Со стороны загрузчика она должна иметь какой-нибудь атрибут типа "no init", иначе при старте будет затерта нулями.
Salamander
Хитро.... Я уж лучше как изначально задумывал - на HC-05 ножки буду зажигать.
Salamander
Тему почти можно закрывать. С ножками от HC-05 все получилось.
В C++ Builder проект добавил VCL, обеспечивающий передачу по протоколу YModem. Вроде бы коннект состоялся, но я ему подсунул какую-то лабуду и конечный результат не оценивал.
Остается дождаться, когда китайские братья пришлют еще один HC-05 и попробовать осуществить полноценную прошивку по воздуху
mantech
Цитата(Salamander @ Mar 9 2015, 03:24) *
Остается дождаться, когда китайские братья пришлют еще один HC-05 и попробовать осуществить полноценную прошивку по воздуху


Добавлю, если хотите качественой прошивки, незабывайте про то, что передавать нужно пакетами с контр. суммой, и иметь механизм перезапросов. Не пробовал для этой цели Ymodem, делал свои протоколы.
Golikov A.
Тему может и можно закрывать, напишу просто как должно быть, чтобы наверняка, если кому пригодится...

1. бутлоадер должен грузиться первым, это если боевой прошивки нет позволит ее залить, также проверить ее целостность и секретность
2. флажок надо передавать через флэш, а переключение программа - бутлоадер делать через перезагрузку
3. отлаживаете программу как обычно через жетаг с 0 адреса, а потом просто компилите и собираете для работы с адреса Н для бутлоадера. Для этого в кейле можно сделать несколько режимов компиляции и сборки

aaarrr
Цитата(Golikov A. @ Mar 9 2015, 12:13) *
2. флажок надо передавать через флэш, а переключение программа - бутлоадер делать через перезагрузку

Зачем через флеш?
ViKo
Цитата(Golikov A. @ Mar 9 2015, 12:13) *
...
3. отлаживаете программу как обычно через жетаг с 0 адреса, а потом просто компилите и собираете для работы с адреса Н для бутлоадера. Для этого в кейле можно сделать несколько режимов компиляции и сборки

Они и есть Target-ы. Недавно спрашивали, зачем они. А вот зачем. rolleyes.gif
Лично мне из основной программы в загрузчик выходить не надо. У меня есть выключатель питания, так и попаду в сброс. Ах... флажок... Да, это можно использовать. Установил флажок, сбросился, дождался прошивки, прошился, сбросил флажок. А если не дождался, по таймауту время отсчитал, сбросил флажок, ушел в основную программу.
Размещу флажок в Backup RAM, она у меня от батарейки питается. Тогда и сброс можно делать, как хочешь.
scifi
Цитата(aaarrr @ Mar 9 2015, 12:22) *
Зачем через флеш?

Просто он так сделал, у него заработало, и менять не стал.
Конечно, нужно проверять регистр причины сброса, и если сброс программный, то проверять флаг в ОЗУ.
Salamander
Ух... только сейчас отладил всю цепочку переключений и обратно. У блютус модуля определенная задержка была при включении PIO, а я не мог понять приичны неустойчивости работы.
Буду теперь YModem из наколенного состояния перепиливать в удобоваримое.
Golikov A.
Цитата
Зачем через флеш?


Цитата
Просто он так сделал, у него заработало, и менять не стал.


Ну можно и так, но мне показалось так надежнее), как и в ход в бутлоадер через рессет.

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

А тут транзакция обновления заканчивается однозначным снятием флага, и это происходит однозначно в конце процесса, и хоть обдергайся питания начал обновлять - обновляй до конца. Опять же можно отловить что кто-то хотел обновить и не смог (может быть sm.gif)
НУ и плюс при производстве, оно первый раз сразу с флагом обновления, что приемная программа на РС ловит, и прошивку ей вкабанивает... Конечно можно было остаться и по пустому флэш, но так как-то надежнее...

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

Вот такие мысли...

Цитата
ни и есть Target-ы. Недавно спрашивали, зачем они. А вот зачем

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

тут взял настроил
- 0 оптимизация дебуг
- нормальная, полный дебуг
- только ошибки
- боевая конфигурация

переключил, и куча флажков и настроек встали одним движением в нормальное состояние...
ViKo
2 Golikov A.
А как это, задать бит во флэш? Целый сектор памяти стирать-программировать...
Таргеты - да, здорово расписали. Опции компилятора переключить мне не сложно, отладкой по ком-порту не пользуюсь, а вот дефайны - да, их же можно задать в свойствах проекта! Правда, отладочных дефайнов у меня с десяток...
mantech
Цитата(Golikov A. @ Mar 9 2015, 23:34) *
А то что при отладке через жетаг для правильного хождения по командам надо иметь уровень оптимизации 0


Это еще зачем?? Всегда выставлял Full optimization под IAR. Зачем чего-то отлаживать на том уровне, который все-равно не будет в релизе?? По первости делал без оптимизации, вроде все работает, потом выставляю фулл - и "привет", висим и все тут...
Golikov A.
Цитата
А как это, задать бит во флэш? Целый сектор памяти стирать-программировать...

тут да, потеря 1 сектора из начальных маленьких...

Цитата
Это еще зачем?? Всегда выставлял Full optimization под IAR.

под кейлом если хотите иметь связь дизасемблера с исходником (хотя думаю и в IAR тоже так надо), то оптимизация должна быть в 0. Соптимизацией пропадает половина переменных, и программа идет как бы по С коду, но такие прыжки делает... В общем с оптимизацией не 0, трассировать программу невозможно.


А если у вас программа с 0 и максимальной оптимизацией работает по разному - это плохо, с этим надо бороться. Меняться может только скорость или размер программы, но никак не функциональность...

Ну и в тему таргетов, не забываем что это может быть реально один проект под разные процы, и там определяется дефайны и свойства проца.... Хотя это конечно тяжелоsm.gif
mantech
Цитата(Golikov A. @ Mar 10 2015, 10:26) *
А если у вас программа с 0 и максимальной оптимизацией работает по разному - это плохо, с этим надо бороться. Меняться может только скорость или размер программы, но никак не функциональность...


Да вот по чем зря, бывает, элементарно, не поставил volatile у какой-нить переменной и все! В нуле-то работает и не жужжит, а в фулл никак...

Цитата(Golikov A. @ Mar 10 2015, 10:26) *
Ну и в тему таргетов, не забываем что это может быть реально один проект под разные процы, и там определяется дефайны и свойства проца.... Хотя это конечно тяжело


Ну да, я так вообще никогда не делаю, это одно дело, IPстек или графическую библиотеку портировать, но весь проект - это уже больно поGNUшнински получается - или по-русски "черт ногу сломит" biggrin.gif
swisst
Цитата(scifi @ Mar 9 2015, 11:56) *
Просто он так сделал, у него заработало, и менять не стал.
Конечно, нужно проверять регистр причины сброса, и если сброс программный, то проверять флаг в ОЗУ.


что Вы имеете в виду под программным сбросом ?
у меня, например, LPC1769 (суть не в камне, а в подходе) - в регистре источника сброса 4 флага: power-on reset, external reset, WDT reset, BOD reset
могу ли я читая другой регистр понять, что сброс был программный ?

если передавать флаг программного сброса через озу (например, совместно с WDT reset), то описано ли в каком нибудь документе то, что содержимое озу не портится во время reset ?
ViKo
Цитата(swisst @ Mar 10 2015, 16:20) *
что Вы имеете в виду под программным сбросом ?
у меня, например, LPC1769 (суть не в камне, а в подходе) - в регистре источника сброса 4 флага: power-on reset, external reset, WDT reset, BOD reset

И если ни один из них не установлен, тогда какой был сброс? rolleyes.gif
swisst
Цитата(ViKo @ Mar 10 2015, 15:36) *
И если ни один из них не установлен, тогда какой был сброс? rolleyes.gif


спасибо. попробую и перепишу bootloader.

вопрос с передачей флага "нужно прошиваться" через SRAM актуален
A. Fig Lee
Цитата(swisst @ Mar 10 2015, 08:20) *
если передавать флаг программного сброса через озу (например, совместно с WDT reset), то описано ли в каком нибудь документе то, что содержимое озу не портится во время reset ?


Таких документов много. Но сама программа, как правило прежде чем дойдет до main()
установит озу в нужное состояние. Чтобы этого не было, в IAR, например надо добавлять __no_init
перед обьявлением переменной.
scifi
Цитата(swisst @ Mar 10 2015, 16:20) *
описано ли в каком нибудь документе то, что содержимое озу не портится во время reset ?

Наверное, не написано, но это и так все знают biggrin.gif
Нужно очень постараться, чтобы затереть статическое ОЗУ одномоментно, не снимая питание.
mantech
Цитата(swisst @ Mar 10 2015, 16:20) *
если передавать флаг программного сброса через озу (например, совместно с WDT reset), то описано ли в каком нибудь документе то, что содержимое озу не портится во время reset ?


Ну сами подумайте, у статики нет инициализации и тактировки, как у динамики, затереть ее может только сама программа, да и то, если не используете монитор питания.
Golikov A.
а как при старте инициализируемые 0 переменные становятся нулевыми? Сброс то у памяти может и быть, а его могу и дергать.

Я не люблю использовать фишки, которые явно не описаны в документации, как минимум это дает мне право искренне возмущаться "а че не работает то?", нежели если недокументированное юзать...
scifi
Цитата(Golikov A. @ Mar 10 2015, 23:44) *
а как при старте инициализируемые 0 переменные становятся нулевыми?

Оч. смешно. Цикл зануляет соответствующие ячейки памяти, если вы ещё не в курсе.

Цитата(Golikov A. @ Mar 10 2015, 23:44) *
Сброс то у памяти может и быть, а его могу и дергать.

Примеры - в студию! Это будет открытие века!
aaarrr
Цитата(Golikov A. @ Mar 10 2015, 23:44) *
а как при старте инициализируемые 0 переменные становятся нулевыми? Сброс то у памяти может и быть, а его могу и дергать.

Программно. Сброса нет. Если бы вдруг был, непременно бы такую фишку задокументировали, не сомневайтесь sm.gif
Golikov A.
Цитата
Оч. смешно. Цикл зануляет соответствующие ячейки памяти, если вы ещё не в курсе.


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

Цитата
Примеры - в студию! Это будет открытие века!

как-то свой проц сделал на FPGA, у него был сброс. Такой пример пойдет? я совершил открытие?

Цитата
Сброса нет.

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

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

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

Вопрос - чисто для себя, представив, что ради флажка затирать целый сектор не очень хочется. Можно ли запускать в бутлодере сторожевой таймер, а проверять его в основной программе? Если основная программа не заработала, то сторожевой таймер инициирует перепрошивку?
Golikov A.
Цитата
main() это главная программа в С.
....
Обычно все это делает ассемлерная программка типично именуемая "startup" или похоже.
Она то и располагается по ресет вектору. Все сделает, обнулит озу, установит константы, а потом перейдет на мейн.


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

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



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

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

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


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

Можно, конечно, вопрос во всех ли процах есть флаг что ресет от сторожевика? Ну и опять же что делать если программа заработала, но не так как хотели?...
scifi
Цитата(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();
}
jcxz
Цитата(swisst @ Mar 10 2015, 19:20) *
если передавать флаг программного сброса через озу (например, совместно с WDT reset), то описано ли в каком нибудь документе то, что содержимое озу не портится во время reset ?

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

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

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

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

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

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

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


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

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

У меня ситуация еще сложнее - ни одна собачья упряжке не угонится за вращающейся деталью, на которой закреплен контроллер))
Мой предыдущий абзац справедлив по отношению к вашим словам тоже. Гарантированность флагов не 100%. В то же время есть Ethernet, по которму мы переправляем прошивку, почему бы не направлять поэтому каналу команды и не сделать бутлодер посговорчивей. Посмотрим также на это с другой стороны - если озвученный мной механизм реализован, то какая надобность во флагах?
aaarrr
Цитата(Salamander @ Mar 11 2015, 11:42) *
Бутлодер информацию о том, что нужно перепрошиться, никогда не получит.

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

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


Ну не суть важно, работающий у меня пример от ST содержит фрагмент, который вроде бы проверяет контрольную сумму.
Вы мне объясните, предложенный мной механим позволит обойтись без флагов во Flash?
Сергей Борщ
Цитата(Salamander @ Mar 11 2015, 10:42) *
Представьте себе, что был сбой птания при перепрошивке. Флага не будет. Основной программе кранты. Бутлодер информацию о том, что нужно перепрошиться, никогда не получит. Спасет только упомянутая выше собачья упряжка. То есть Ваш вариант абсолютно не предусматривает битой прошивки.
У меня этот вариант прекрасно работает и со сбоями питания и с разрывами связи. Разумеется, после сброса без флага (по собаке или включению питания) загрузчик проверяет целостность приложения и если CRC не сходится - он сам ожидает повторную команду "начинаем обновление". Кроме этой команды еще он может ответить нулем на запрос "какая в этом устройстве версия прошивки?" т.е. сообщить, что приложение поломано и необходимо обновление. Больше от него ничего не требуется. Ему не нужны ни флаги во флеш, ни флаги в ОЗУ. Приложению о нем тоже ничего знать не нужно, от приложения требуется только сделать программный сброс по команде "обновляемся". Система проста и надежна как трехлинейная винтовка.
Golikov A.
В вашем случае да, вы по UART можете долбить командой перепрошивки до тех пор пока не получите ответ что готовы перепрошивать. Есть одна сложность если контроллер загрузиться в середине вашей команды, то он может получить не верные данные, но это детали... можно побороть.

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

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

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

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

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

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

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

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

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

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

А для таких случаев делаем режим recovery по кнопке.
Golikov A.
вот, так что кнопка нужна! sm.gif

Да те кто правит и пишет стартап перед каждым проектом, снимаю шляпу, вы вызываете уважение, я видать уже обленился, пользуюсь выданным)
aaarrr
Цитата(Golikov A. @ Mar 11 2015, 13:00) *
вот, так что кнопка нужна! sm.gif

Нужна, но не для того, чтобы на неё нажимать. Только для нештатных ситуаций.
Salamander
Цитата(aaarrr @ Mar 11 2015, 13:03) *
Нужна, но не для того, чтобы на неё нажимать. Только для нештатных ситуаций.


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


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

...

А зачем его править? Я же написал английским по белому: __no_init объявление в С программе делает то, что надо.


У меня без CRC:
есть флажок в EEPROM: "программа годная, хорошая".
По старту всегда стартует бутлоадер, который
смотрит есть ли этот флаг, если есть, то делает проверку, хочет ли кто загрузить фирмварь, нет - прыгает на основную программу.
Если флага нет, никуда прыгать не будет.
Будет ждать аплоада фирмваря.
Аплоад фирмваря заключается в а) стирании флага; б) аплоада и в) прыжка на эту программу после аплоада.
Если аплоад не получился по какойто причине, прыжка не будет, будет опять пытатся сделать аплоад.

Главная программа стартует, инициализируется, проверяет че надо, и если флажок не стоит, записывает его.
kolobok0
Цитата(Salamander @ Mar 11 2015, 13:46) *
Но если очень хочется нажать, то можно)))



Если не боитесь программить - то ышо один вариант - хранить во флеше более одной рабочей прошивки.
Для AVR без проблем делается делением лапополам и вся недолга. С каждой заливкой чередуются верхняя половинка/нижняя.
Прошивка пишется с последнего сектора. Последним прошивается таблица векторов. Т.к. сектор записи больше чем таблица векторов
- то за таблицей можно расположить служебную инфу. Типа номер прошивки и иже. Чтоб не было камня - достаточно обеспечить
стабильность работы в течении записи одного всего сектора.

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

Почему "если не боитесь" - замороты с адресацией. везде косвенная. Что не всегда поддерживают на ура компиляторы. Особенно когда
кода больше чем ближний(оптимизированный) переход. Ослинные уши вылазят в основном на языках си и выше. На армах юзаю IAR -
грешен в нём так-же компилятор sm.gif Посему системы записи места краша программы - актуально выходит на первое место. Ну и скидывания причины в удобный вид.
Отсюда понятно - что в системе должен быть как минимум накопитель (к примеру микро сд).

Но можно sm.gif
mantech
Цитата(kolobok0 @ Mar 11 2015, 23:23) *
Если не боитесь программить - то ышо один вариант - хранить во флеше более одной рабочей прошивки.


Да и зачем?? Если бутлодырь "правильный", то перезальет любую кривозалитую прошивку, а все эти дубли и пр, только усложняют прогу и уменьшают объем флешки... Если уж бутлодырь кривой, то и 3 копии не помогут, проверял на собственном опыте, лучше делать больше вариантов прошивки в буте, например, флешка, уарт, а если нужно удаленно - сеть...
Salamander
Хм... опять что-то нездравое творится.
Я залил бутлодер, предложенный ST, сделал все в соответствии с AN2557. Заливаю прошивку с помощью все того же HYperTerminal, предложенного в AN2557. Прошивка получена из проекта Keil, специально настроенного под задачу - перенесен адрес приложения, таблица векторов, в общем - если прошивать и бутлодер и основную программу с помощью Keil - они мирно сосуществуют, прыжки из бутлодера в программу и наоборот - без проблем.
Но стоит залить прошивку с помощью HyperTerminal - основная программа не запускается. Отладчиком выяснено, что до функции Jump_To_Application() бутлодер добирается, а дальше - если остановить отладчик - видно что программа висит в HardFault_Handler.
Господа, я не силен в отладке - чо мне делать дальше, как понять, что и почему не так пишется?
Вектора переношу вот так
Цитата
__set_PRIMASK(1);
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);
__set_PRIMASK(0);


Еще один момент, для понимания: предположив, что прошивка пишется не со смещением, а несколько затирает бутлодер, то бишь портит его - я прошиваю основную программу Keil'ом. По идее, если бутлодер битый, это не поможет. Ан нет - все становится на свои места. Значит битая основная программа. Но я тогда не пойму, почему отлоадчик остается в бутлодере? ПО идее дали пкоманду прыгнуть по адресу основной программы и все - отладчик из бутлодера ушел...

Прикрепляю бутлодер от ST
ViKo
Вот здесь почитайте, может, даст толчок.
http://electronix.ru/forum/index.php?showt...t&p=1317836
У меня все заработало.
Salamander
Ну не знаю, я так понял, что у вас вообще не грузилась основная программа. А у меня она грузится, если прошить Keil и перезапустить. А если прошить bootloaderом - то не грузится.
Вопрос - Keil у меня грузит в контроллер файл axf. Бутлодеру я подсовываю hex. Есть предположение, что как-то неправильно генерируется hex. Чтобы проверить это - как мне заставить Keil отправить в контроллер hex файл?

Еще вопрос - окно Memory что показывает - Flash или Ram?


///////////////


Разобрался как подсунуть HEX - Keil шьет его нормально....

В настройках Keil есть пункт IROM - в нем 2 поля, первое эт старт - 0x8003000, с ним все понятно. ВТорое - size 0x80000. Что-то я не нашел в коде бутлодера, где было бы такое значение, значит оно не учитывается бутлодером?

Залил по очереди прошивки - кейлом и бутлодером. Скачал по очереди, в HEX редакторе сравнил. Идентичны до адреса 0x00007477 (это смещение от 0x800....)
Дальше каждый байт различен....
A. Fig Lee
Цитата(Salamander @ Mar 14 2015, 02:23) *
видно что программа висит в HardFault_Handler.
Господа, я не силен в отладке - чо мне делать дальше, как понять, что и почему не так пишется?


Скорее всего чтото недоинициализированно. После бутлоадера осталось.

Вот смотреть адреса lr, pc - это откуда хард фолт случился.

CODE

void hard_fault_handler_c(unsigned int * hardfault_args)
{
unsigned int stacked_r0;
unsigned int stacked_r1;
unsigned int stacked_r2;
unsigned int stacked_r3;
unsigned int stacked_r12;

stacked_r0 = ((unsigned long) hardfault_args[0]);
stacked_r1 = ((unsigned long) hardfault_args[1]);
stacked_r2 = ((unsigned long) hardfault_args[2]);
stacked_r3 = ((unsigned long) hardfault_args[3]);

stacked_r12 = ((unsigned long) hardfault_args[4]);
stacked_lr = ((unsigned long) hardfault_args[5]);
stacked_pc = ((unsigned long) hardfault_args[6]);
stacked_psr = ((unsigned long) hardfault_args[7]);

while (1) ;

}


/*******************************************************************************
* Description : This function handles Hard Fault exception.
* Input : -
* Return : -
*******************************************************************************/
void HardFault_Handler(void)
{
// Go to infinite loop when Hard Fault exception occurs
asm("TST LR, #4");
asm("ITE EQ");
asm("MRSEQ R0, MSP");
asm("MRSNE R0, PSP");
asm("B hard_fault_handler_c");
while (1);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.