|
|
  |
Как программно загнать STM32 в бутлоадер? |
|
|
|
Mar 7 2015, 17:20
|
Местный
  
Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893

|
Цитата(Salamander @ Mar 7 2015, 21:00)  На AVR все делалось просто - загрузчик запускался первым и по таймауту отдавал управление основной программе. А в тексте основной программы некая функция слушала USART и по определенной команде перезагружала контроллер. А как в STM - ну подам я на BOOT0 единичку - ее же нужно держать какое-то время после Reset. Я хочу прошивать дистанционно - по bluetooth (hс-05) может задержать BOOT0 на RC цепочке?
|
|
|
|
|
Mar 7 2015, 17:25
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(smalcom @ Mar 7 2015, 20:19)  программно никак. используйте одновибратор на ножках BOOTx А какова длительность импульса?
|
|
|
|
|
Mar 7 2015, 18:29
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
В доках нашел, что условий запуска загрузчика 6. Вот одно их условий Цитата nBoot0(bit) = 0, nBoot1(bit) = 1 and nBoot0_SW(bit) = 0 Так может быть эти биты как-то устанавливаются? И тогда можно программно зайти? Я уже писал, что хочу использоват bluetooth модуль HC-05. У него есть пины общего назначения, которые можно включать и выключать AT командой. Эти пины можно подключить и к Boot и к Reset. Но вот как тогда выходить из bootloader...
|
|
|
|
|
Mar 7 2015, 18:59
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(Salamander @ Mar 7 2015, 21:53)  Я усомнился, что так вожно в STM, поскольку у него для этого есть железная ножка. А задав вопрос здесь, услышал "программно никак". Я просто вообще не понимаю, зачем дрыгать какими-то ножками, если все можно сделать программно?? Кто сказал, что "программно никак"?? Всегда делал программно - стартует буллоадер, опрашивает, есть-ли варианты загрузки, если нет, переопределяем контр. прерываний и на адрес основной проги. В основной проге сбрасываем собаку, а если надо рестартануть - не сбрасываем и все!!
|
|
|
|
|
Mar 7 2015, 19:02
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Железная ножка чтобы загрузить встроенный загрузчик, в который можно писать данные по ком порту.
А что вам мешает написать программу, которая будет принимать данные по блютусу, и записывать их во флэш?
Так все и делают, пишут свою программу, которая запускается первой проверяет надо ли - можно ли грузить нормальную программу, и если да передают управление ей, а если нет сидят и ждут когда придется прошивка. Приходящую прошивку распихивают во флэш память и запускают...
ножка - это не ограничение а доп фишка, используя ее, данные загрузки надо будет слать в специальном формате, ваш блютус с этим справиться?
|
|
|
|
|
Mar 7 2015, 19:12
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(mantech @ Mar 7 2015, 21:59)  Я просто вообще не понимаю, зачем дрыгать какими-то ножками, если все можно сделать программно?? Кто сказал, что "программно никак"?? Всегда делал программно - стартует буллоадер, опрашивает, есть-ли варианты загрузки, если нет, переопределяем контр. прерываний и на адрес основной проги. В основной проге сбрасываем собаку, а если надо рестартануть - не сбрасываем и все!! Где почитать, а то мне в основном какая-то вода попадается. Как сделать, чтобы бутлодер стартовал без ножки Boot0 ? Цитата А что вам мешает написать программу, которая будет принимать данные по блютусу, и записывать их во флэш? Погодите.... У меня подуль HC-05. Ни компьютер, ни STM32 понятия не имеют, что работают с блютус. Они думают, что работают с USART. Сегодня когда я озадачился бутлоадером, я не подключая блютус модуль скачал FlashLoader Demonstrator, а к STM32 подключил USB-COM конвертер. ПРошивать не пробовал, но контакт контроллера и компа состоялся. ЗАчем мне писать загрузчик, если он уже есть внутри STM32? ПРоцесс заливки прошивки по блютус я могу организовать хоть сейчас (был бы у меня второй HC-05), но мне не нравится только одно - я не хочу жать на кнопку Boot0. Цитата первой проверяет надо ли - можно ли грузить нормальную программу, А как это понять? Смотрите, как я хочу сделать - работает STM, принимает команды по USART (через блютус). Выполняет их. Как только получает заранее оговореную последовательнось байт - делает что-то, чтобы запустить bootloader. Перепрошивается и вновь запускает основную программу. То есть мне нужно проверять условие не при старте, а во время работы и из работающей программы посылать контроллер на перепрошивку. На АВР я 3 года назад как-то так делал...
|
|
|
|
|
Mar 7 2015, 19:18
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
как вы хотите все уже поняли, и вам сообщили что не зажав ногу бут при ресете никак...
правильно делается так.
Первой стартует программа загрузчик. Она проверяет 1. наличие флага обновления прошивки 2. целостность прошивки 3. секретный код (если не хотите чтобы левые люди запускали свои прошивки) если все хорошо, дальше запускается нормальная прошивка... нет ждет обновления прошивки....
Когда вы хотите обновить прошивку из программы, вы ставите флаг обновления и перегружаетесь, после этого запуститься бутлоадер и по 1 условию останется ждать прошивку, а когда обновите прошивку, просто снимаете флаг, и опять перегружаетесь...
все работает по одному сценарию, предсказуемо и надежно. Доп бонусом идет что загрузчик следит сам за тем чтобы ничего в его область не записали, это делает не убиваемый загрузчик.... Можно добавить 4 условие таймаут в загрузчике, если придут данные остается в загрузчике, на случай если будет корректная по всем условиям прошивка не могущая выставить 1 флаг. Ну или кнопку, я кнопку предпочитаю...
Из плюсов что бутлоадер может делать какую-то диагностику, и вести какой-то диалог, хотя бы сможет объяснить что что-то плохо
|
|
|
|
|
Mar 7 2015, 19:19
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(Golikov A. @ Mar 7 2015, 22:12)  Ну тогда вам стоит написать бутлоадер хотя бы для того чтобы "не жать на кнопку Boot0." А... я начинаю понимать. "свой" бутлодер - это не свой вариант кода, которым мы затираем заводской бутлодер, а дополнительная программа, которая располагается в начальном адресе памяти? Заводской бутлодер никуда не девается, и по прежнему может вызываться кнопкоу boot, но мы им просто не пользуемся. Я правильно понял?
|
|
|
|
|
Mar 7 2015, 19:23
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(Golikov A. @ Mar 7 2015, 22:21)  да, аминь  алилуйа... Ну зачем же менято было пугать вторым постом? Побегал по настройкам Keil... Скажите, а можно ли как-то все это настроить, чтобы все так же шить через KEIL? Ну как будто у меня контроллер через Jtag шьется (я понимаю, что отладка невозможна). То есть нажал в KEIL кнопку прошивки, он через USART и залил?
|
|
|
|
|
Mar 7 2015, 19:49
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(Golikov A. @ Mar 7 2015, 22:26)  Ну наверное как-то можно... Но я прикинул что на выяснения как у меня уйдет больше времени чем на написание внешнего терминальчика.
Тем более у нас в некоторых продуктах прошивка скрыта от пользователя. То есть он просто запускает программу управления на компьютере, а она сама проверяет если железо старое, меняет ему прошивку, пользователь даже не знает что там было... Так что в производстве можно даже прогу не лить, просто грузишь загрузчик, он как раз заливается кейлом по жетагу. И все, дальше при первом включении плата приобритет необходимую прошивку. У меня мотивация другая - устройство будет вращаться))) Не хочется останавливать, подключать разъем, потом снова запускать. Ленивый я. Поиски бутлодера под KEIL привели только к примеру под STM8... Кто-нибудь ткнет носом, где скачать?
|
|
|
|
|
Mar 7 2015, 19:51
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 28-09-06
Из: Минск
Пользователь №: 20 776

|
В заводской загрузчик на STM32F205 вхожу так: Код #define BOOTLOADER_ADDR 0x1FFF0000
typedef void (*pFunction)(void); pFunction Jump_To_Bootloader; uint32_t JumpAddress;
JumpAddress = *(__IO uint32_t*) (BOOTLOADER_ADDR + 4); Jump_To_Bootloader= (pFunction) JumpAddress; /* Initialize Stack Pointer */ __set_MSP(*(__IO uint32_t*) BOOTLOADER_ADDR ); Jump_To_Bootloader(); На других STM-ках возможно что-то подобное можно сделать.
|
|
|
|
|
Mar 7 2015, 19:58
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(AVNN @ Mar 7 2015, 22:51)  В заводской загрузчик на STM32F205 вхожу так: Код #define BOOTLOADER_ADDR 0x1FFF0000
typedef void (*pFunction)(void); pFunction Jump_To_Bootloader; uint32_t JumpAddress;
JumpAddress = *(__IO uint32_t*) (BOOTLOADER_ADDR + 4); Jump_To_Bootloader= (pFunction) JumpAddress; /* Initialize Stack Pointer */ __set_MSP(*(__IO uint32_t*) BOOTLOADER_ADDR ); Jump_To_Bootloader(); На других STM-ках возможно что-то подобное можно сделать. Я попробовал - контроллер куда то улетает на строчке JumpAddress. То есть, если ставить брейкпоинт на эту строку, отладчик его ловит, если на следюущую - не ловит.
|
|
|
|
|
Mar 7 2015, 20:12
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 28-09-06
Из: Минск
Пользователь №: 20 776

|
Цитата(Salamander @ Mar 7 2015, 22:58)  Я попробовал - контроллер куда то улетает на строчке JumpAddress. То есть, если ставить брейкпоинт на эту строку, отладчик его ловит, если на следюущую - не ловит. У меня компилятор IAR. Вот что он в asm выдает Код 163 JumpAddress = *(__IO uint32_t*) (BOOTLOADER_ADDR + 4); \ 00000030 0x.... LDR.N R0,??DataTable1_4 ;; 0x1fff0000 \ 00000032 0x6841 LDR R1,[R0, #+4] \ 00000034 0x60A1 STR R1,[R4, #+8] 164 Jump_To_Bootloader = (pFunction) JumpAddress; \ 00000036 0x6061 STR R1,[R4, #+4] 165 /* Initialize Stack Pointer */ 166 __set_MSP(*(__IO uint32_t*) BOOTLOADER_ADDR); \ 00000038 0xE003 B.N ??main_2 167 Jump_To_Bootloader(); \ ??main_2: (+1) \ 00000042 0x6800 LDR R0,[R0, #+0] \ 00000044 0xF380 0x8808 MSR MSP,R0 175 Jump_To_Application(); \ 00000048 0x4608 MOV R0,R1 \ 0000004A 0x4780 BLX R0
|
|
|
|
|
Mar 7 2015, 21:10
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Salamander @ Mar 7 2015, 19:00)  Я хочу прошивать дистанционно - по bluetooth (hс-05) Я бы присоединился к ответу smalcom и предложил аппаратный переход во встроенный UART загрузчик STM32F, коммуникационный протокол которого описан в документации. Прилагаю схему сброса процессора: при удержании кнопки сброса дольше чем, примерно, 1.5 секунд, и последующем (естественно) ее отпускании процессор улетает в BOOT. Подбором конденсатора С11 можно время изменить, если надо. Не знаком пока с HC-05, но если он поддерживает UART, может он поддерживает и линии квитирования UART. Взяв сигнал RTS, можно завести его на NRST.
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 7 2015, 22:06
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Секунду... вот дока http://www.icbase.com/Promotion/download/AN2606.pdfРаздел 3.3 - таблица два. Исходя из нее в контроллерах не Value-серии встроенный загрузчик к адресу не привязан... Так может быть действительно в него нельзя программно прыгнуть? Цитата Не знаком пока с HC-05, но если он поддерживает UART, может он поддерживает и линии квитирования UART. Взяв сигнал RTS, можно завести его на NRST. Тогда и Ваша схема не нужна. Но есть одно но... если включить какую-нибудь ножку на HС-05, то без переписывания бутлодера ее не выключишь. И сколько не перезагружай контроллер - он все время будет в загрузчик залетать. Кто-нибудь из присутствующих может реально в железе попробовать программно запустить встроенный загрузчик? Что-то безрезультатно....
|
|
|
|
|
Mar 8 2015, 05:45
|

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

|
Одни утверждают, что нельзя программно запрыгнуть в системный загрузчик, другие приводят программу, которая скачэ... Чудеса. Попробую сам. Не вижу принципиальных трудностей. Узнать адрес, и гоу ту... Ножки бута нужны, чтобы сразу перенестись в загрузчик при старте, только и всего. Salamander, вы не поняли. В таблице два указан адрес идентификатора загрузчика. Это не обязательно. Мы и так знаем, какой загрузчик в мк. И адрес загрузчика всегда конкретный, описан в разделах микроконтроллеров.
|
|
|
|
|
Mar 8 2015, 06:19
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(ViKo @ Mar 8 2015, 08:45)  Одни утверждают, что нельзя программно запрыгнуть в системный загрузчик, другие приводят программу, которая скачэ... Чудеса. Попробую сам. Не вижу принципиальных трудностей. Узнать адрес, и гоу ту... Ножки бута нужны, чтобы сразу перенестись в загрузчик при старте, только и всего. Дак в этом и есть прелесть самописого бутлодыря - то, что он сперва сам запускается, даже если прога вообще еще не загружена, причем никаких ногодрыгов и т.п. Как вы будете "запрыгивать" в стшный загрузчик, если прога еще не загружена??
|
|
|
|
|
Mar 8 2015, 06:58
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Не вижу принципиальных трудностей. Узнать адрес, и гоу ту... Ножки бута нужны, чтобы сразу перенестись в загрузчик при старте, только и всего. думаю зависит от реализации... Вон в LPC1768 и семействе ножка бут подменяет 0 регион, с векторами прерывания и прочее... Тут об Гоу тушишься, а загрузчика просто нет пока ногой не подергал. Так что думаю не всегда можно просто перепрыгнуть по адресу. Другое дело что сделать свой загрузчик по примерам не сложно, а он все же дает большие возможности.....
|
|
|
|
|
Mar 8 2015, 07:13
|

Частый гость
 
Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460

|
Цитата(Aner @ Mar 8 2015, 01:29)  Прошивать дистанционно без написания собственного загрузчика нереально, программно запустить встроенный загрузчик низя. Еслиб было можно то что тогда ...? В том то и дело. А все железные приблуды с удержанием, загонят случайно в загрузчик и что тогда? Только ресет, а где его взять дистанционно, аппататный? Нигде, придется ехать за сотню км и перегружать железку, неправильно это. Ну вы парни даете... Можно!!! Выше приведенный пример джампа рабочий. Использую подобную методику на stm32f1 и stm32f4 единственный нюанс это деинитить клоки и периферию перед переходом, что бы сам bootloader это мог сделать корректно. Протокол работы с STшным бутлоадером подробно описан в AN3155Но! Если нет уверенности в надежности канала(канала передачи ПО), я бы порекомендовал использовать буфер(внешняя flash или половина flash контроллера если размер ПО позволяет) тоесть заливать прошивку после полного получения, а затем ее прошивать, но понятно, в этом случае понадобится уже свой bootloader с методикой работы описанной вышей. P.S. Если есть сомнения в работе встроенного bootloader , достаточно в startup.s сделать джамп до инита железа.
|
|
|
|
|
Mar 8 2015, 08:45
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(Aner @ Mar 8 2015, 01:29)  Прошивать дистанционно без написания собственного загрузчика нереально, программно запустить встроенный загрузчик низя. Да как же? А вот http://www.youtube.com/watch?v=cvKC-4tCRgwПравда это для F4 серии, но ссылаются на тот же документ, в котором я адреса бутлодера смотрел. Цитата(mantech @ Mar 8 2015, 09:19)  Дак в этом и есть прелесть самописого бутлодыря - то, что он сперва сам запускается, даже если прога вообще еще не загружена, причем никаких ногодрыгов и т.п. Как вы будете "запрыгивать" в стшный загрузчик, если прога еще не загружена?? А зачем мне в него прыгать до загрузки? На отладочной плате есть кнопка, ее надо жать до ресета и отпускать потом, понятное дело, что в загрузчик мы попадаем до основной программы. Но у меня приложение беспроводное, чтобы оно поняло что нужно прошиваться ему нужно команду по воздуху получить, а для этого как раз основная программа должна работать. Цитата достаточно в startup.s сделать джамп до инита железа. Да! Вот теперь получилось. Но все очень сложно... Только определенная последовательность действий. Нужно сначала загрузить FlashLoader, потом сделать Reset на контроллере и только тогда появляется связь. Если сначала запустить устройство, а потом FlashLoaer и не сделать Reset - пишет unrecognized device. Все-таки свой бутлодер буду писать. И свой софт. Да елки - нигде не могу найти исходник бутлодера. Они существуют в природе?
Сообщение отредактировал Salamander - Mar 8 2015, 08:16
|
|
|
|
|
Mar 8 2015, 09:25
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата А зачем мне в него прыгать до загрузки? На отладочной плате есть кнопка, ее надо жать до ресета и отпускать потом, понятное дело, что в загрузчик мы попадаем до основной программы. Но у меня приложение беспроводное, чтобы оно поняло что нужно прошиваться ему нужно команду по воздуху получить, а для этого как раз основная программа должна работать. а если во время загрузки будет обрыв связи? нормальной программы уже не будет, и вот у вас беспроводной кирпич... Цитата Все-таки свой бутлодер буду писать. И свой софт. это правильно собственно вам надо написать программу которая кладет пришедшие данные во флэшь и запускает программу по новому адресу. http://www.st.com/st-web-ui/static/active/...rchtype=keywordто есть вам надо на самом деле найти 2 документа запись данных во флэш и запуск прошивки с произвольного адреса.
|
|
|
|
|
Mar 8 2015, 09:52
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(scifi @ Mar 8 2015, 12:41)  Прикладываю реальный загрузчик для STM32. Грузит прошивку через TFTP с буфером во внешней SPI flash памяти. Ох и наворочено....
|
|
|
|
|
Mar 8 2015, 11:00
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(scifi @ Mar 8 2015, 12:57)  Любой загрузчик, делающий чуть больше, чем "два байта переслать", будет "навороченным". Никуда от этого не деться... Да не скажите. Вот нашел первоисточник от ST - более или менее понятно. http://www.st.com/web/en/catalog/tools/FM1...chtype=keyword#
|
|
|
|
|
Mar 8 2015, 14:43
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Вроде бы получилось - в начальных адресах расположил бутлодырь http://www.st.com/web/en/catalog/tools/FM1...chtype=keyword# По адресу 0x8003000 основную программу. В виду сложности отладки и расстановки брейкпоинтов в таком режиме я зажигаю диодики. Диодики показали, что бутлодырь грузится, а дальше управление передается основной программе. В основной программе контролирую unsigned char NEED_TO_LOAD и если она равна единичке (сам пишу единичку в окне watch) программу кидает на адрес загрузчика. А в загрузчике (бутлоадере) таже переменная unsigned char NEED_TO_LOAD контроллируется, и если она равна единичке, то запускается прошивка, если нет передается управление основной программе. Я понимаю всю наивность моей попытки дать одинаковое имя переменной в разных программах и расчитывать, что она будет видна в обоих. Но попробовать надо было. Не получилось. Как мне в основной программе записать флажок, чтобы этот флажок был виден в бутлодыре?
|
|
|
|
|
Mar 8 2015, 18:25
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(ViKo @ Mar 8 2015, 21:08)  Добавить к переменной атрибут __attribute((at(0x08020000))) . Спасибо, а я хотел бы еще так для себя поинтересоваться, а если в процессе компиляции компилятор присвоит какой-либо переменной некий адрес, а потом я в конце захочу указанным атрибутом этот же адрес присвоить другой переменной? Что будет? Или компилятор в первую очередь распределяет явно указанные адреса? Погодите... но если я в бутлодере напишу __attribute((at(0x08020000))) то эта переменная очистится... Как решить задачу?
|
|
|
|
|
Mar 8 2015, 20:29
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Salamander @ Mar 8 2015, 17:43)  Как мне в основной программе записать флажок, чтобы этот флажок был виден в бутлодыре? Флажка тут мало: он может и случайно оказаться равен 1. Используйте 32 битное слово с каким-нибудь нетривиальным значением. Передать есть несколько способов (в порядке нарастания сложности): 1. Записать в какой-нибудь периферийный scratchpad-регистр (скажем, регистры ключа AES у вашего процессора). 2. "Спрятать" кусочек RAM от линкера, и писать-читать по указателю. 3. Определить честную секцию с фиксированным адресом для хранения флага. Со стороны загрузчика она должна иметь какой-нибудь атрибут типа "no init", иначе при старте будет затерта нулями.
|
|
|
|
|
Mar 9 2015, 09:55
|

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

|
Цитата(Golikov A. @ Mar 9 2015, 12:13)  ... 3. отлаживаете программу как обычно через жетаг с 0 адреса, а потом просто компилите и собираете для работы с адреса Н для бутлоадера. Для этого в кейле можно сделать несколько режимов компиляции и сборки Они и есть Target-ы. Недавно спрашивали, зачем они. А вот зачем. Лично мне из основной программы в загрузчик выходить не надо. У меня есть выключатель питания, так и попаду в сброс. Ах... флажок... Да, это можно использовать. Установил флажок, сбросился, дождался прошивки, прошился, сбросил флажок. А если не дождался, по таймауту время отсчитал, сбросил флажок, ушел в основную программу. Размещу флажок в Backup RAM, она у меня от батарейки питается. Тогда и сброс можно делать, как хочешь.
|
|
|
|
|
Mar 9 2015, 20:34
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Зачем через флеш? Цитата Просто он так сделал, у него заработало, и менять не стал. Ну можно и так, но мне показалось так надежнее), как и в ход в бутлоадер через рессет. сценарий. перевели в обновление прошивки, перезагрузка, определили что остаться в бутлоадере начали грузить прошивку - сбой питания старт после отключения питания и что будет с флажком и признаком перезагрузки? (у меня батарейки нет), а дальше как биты лягут, пойдет такое дело и окажется битая прошивка с нормальным кодом и контрольной суммой, и вот вам здрасте приехали - кирпич. (знаю что вероятность меньше уничтожения платы метеоритом, но даже ее исключить мне ничего не стоило, так почему бы нет?) А тут транзакция обновления заканчивается однозначным снятием флага, и это происходит однозначно в конце процесса, и хоть обдергайся питания начал обновлять - обновляй до конца. Опять же можно отловить что кто-то хотел обновить и не смог (может быть  ) НУ и плюс при производстве, оно первый раз сразу с флагом обновления, что приемная программа на РС ловит, и прошивку ей вкабанивает... Конечно можно было остаться и по пустому флэш, но так как-то надежнее... ровно тоже с переходом через перезагрузку. Если путь 1 его можно проверить и понять что работает, если есть ветвления - это всегда потенциальная возможность ошибки... и вариации... Вот такие мысли... Цитата ни и есть Target-ы. Недавно спрашивали, зачем они. А вот зачем А то что при отладке через жетаг для правильного хождения по командам надо иметь уровень оптимизации 0, а для работы повыше? Вас не парит все время через опшинсы руками переставлять? А отладка в порт с кучей сообщений и режимом только ошибок переключать, не забывая дефайны пробивать? тут взял настроил - 0 оптимизация дебуг - нормальная, полный дебуг - только ошибки - боевая конфигурация переключил, и куча флажков и настроек встали одним движением в нормальное состояние...
|
|
|
|
|
Mar 10 2015, 07:26
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата А как это, задать бит во флэш? Целый сектор памяти стирать-программировать... тут да, потеря 1 сектора из начальных маленьких... Цитата Это еще зачем?? Всегда выставлял Full optimization под IAR. под кейлом если хотите иметь связь дизасемблера с исходником (хотя думаю и в IAR тоже так надо), то оптимизация должна быть в 0. Соптимизацией пропадает половина переменных, и программа идет как бы по С коду, но такие прыжки делает... В общем с оптимизацией не 0, трассировать программу невозможно. А если у вас программа с 0 и максимальной оптимизацией работает по разному - это плохо, с этим надо бороться. Меняться может только скорость или размер программы, но никак не функциональность... Ну и в тему таргетов, не забываем что это может быть реально один проект под разные процы, и там определяется дефайны и свойства проца.... Хотя это конечно тяжело
|
|
|
|
|
Mar 10 2015, 07:32
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(Golikov A. @ Mar 10 2015, 10:26)  А если у вас программа с 0 и максимальной оптимизацией работает по разному - это плохо, с этим надо бороться. Меняться может только скорость или размер программы, но никак не функциональность... Да вот по чем зря, бывает, элементарно, не поставил volatile у какой-нить переменной и все! В нуле-то работает и не жужжит, а в фулл никак... Цитата(Golikov A. @ Mar 10 2015, 10:26)  Ну и в тему таргетов, не забываем что это может быть реально один проект под разные процы, и там определяется дефайны и свойства проца.... Хотя это конечно тяжело Ну да, я так вообще никогда не делаю, это одно дело, IPстек или графическую библиотеку портировать, но весь проект - это уже больно поGNUшнински получается - или по-русски "черт ногу сломит"
|
|
|
|
|
Mar 10 2015, 13:20
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425

|
Цитата(scifi @ Mar 9 2015, 11:56)  Просто он так сделал, у него заработало, и менять не стал. Конечно, нужно проверять регистр причины сброса, и если сброс программный, то проверять флаг в ОЗУ. что Вы имеете в виду под программным сбросом ? у меня, например, LPC1769 (суть не в камне, а в подходе) - в регистре источника сброса 4 флага: power-on reset, external reset, WDT reset, BOD reset могу ли я читая другой регистр понять, что сброс был программный ? если передавать флаг программного сброса через озу (например, совместно с WDT reset), то описано ли в каком нибудь документе то, что содержимое озу не портится во время reset ?
|
|
|
|
|
Mar 10 2015, 13:53
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425

|
Цитата(ViKo @ Mar 10 2015, 15:36)  И если ни один из них не установлен, тогда какой был сброс?  спасибо. попробую и перепишу bootloader. вопрос с передачей флага "нужно прошиваться" через SRAM актуален
|
|
|
|
|
Mar 10 2015, 13:56
|

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

|
Цитата(swisst @ Mar 10 2015, 08:20)  если передавать флаг программного сброса через озу (например, совместно с WDT reset), то описано ли в каком нибудь документе то, что содержимое озу не портится во время reset ? Таких документов много. Но сама программа, как правило прежде чем дойдет до main() установит озу в нужное состояние. Чтобы этого не было, в IAR, например надо добавлять __no_init перед обьявлением переменной.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Mar 10 2015, 15:41
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(swisst @ Mar 10 2015, 16:20)  если передавать флаг программного сброса через озу (например, совместно с WDT reset), то описано ли в каком нибудь документе то, что содержимое озу не портится во время reset ? Ну сами подумайте, у статики нет инициализации и тактировки, как у динамики, затереть ее может только сама программа, да и то, если не используете монитор питания.
|
|
|
|
|
Mar 10 2015, 20:52
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Golikov A. @ Mar 10 2015, 23:44)  а как при старте инициализируемые 0 переменные становятся нулевыми? Оч. смешно. Цикл зануляет соответствующие ячейки памяти, если вы ещё не в курсе. Цитата(Golikov A. @ Mar 10 2015, 23:44)  Сброс то у памяти может и быть, а его могу и дергать. Примеры - в студию! Это будет открытие века!
|
|
|
|
|
Mar 10 2015, 21:38
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Оч. смешно. Цикл зануляет соответствующие ячейки памяти, если вы ещё не в курсе. Достаточно весело. У вас в main есть такой цикл? Это я к тому что советуя передать переменную через память сквозь ресет, надо еще уточнить где и что задушить, чтобы человек не бился с 0 переменной как рыба об лед. Цитата Примеры - в студию! Это будет открытие века! как-то свой проц сделал на FPGA, у него был сброс. Такой пример пойдет? я совершил открытие? Цитата Сброса нет. жаль....
|
|
|
|
|
Mar 11 2015, 01:35
|

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

|
Цитата(Golikov A. @ Mar 10 2015, 16:38)  Достаточно весело. У вас в main есть такой цикл? Это я к тому что советуя передать переменную через память сквозь ресет, надо еще уточнить где и что задушить, чтобы человек не бился с 0 переменной как рыба об лед. main() это главная программа в С. Прежде чем до нее дойдет дело, переменные которые у вас объявлены, должны быть проинициализированы, обработчики векторов установлены, стек пойнтер заряжен и так далее. Обычно все это делает ассемлерная программка типично именуемая "startup" или похоже. Она то и располагается по ресет вектору. Все сделает, обнулит озу, установит константы, а потом перейдет на мейн.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Mar 11 2015, 04:59
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата сценарий. перевели в обновление прошивки, перезагрузка, определили что остаться в бутлоадере начали грузить прошивку - сбой питания старт после отключения питания и что будет с флажком и признаком перезагрузки? Вы тысячу раз правы. Кончено этоа проблема решается своеобразным костылем - можно сделать два признака перепрошивки - один - это флажок, устанавливаемый внутри основной программы, второй признак - это если перепрошить хочет компьютер. То есть запускаешь программу, включаешь устройство. Бутлодер видит отсутствие флажка, но по USART к нему поступают предложения руки и сердц- значит надо давать согласие))) Вопрос - чисто для себя, представив, что ради флажка затирать целый сектор не очень хочется. Можно ли запускать в бутлодере сторожевой таймер, а проверять его в основной программе? Если основная программа не заработала, то сторожевой таймер инициирует перепрошивку?
|
|
|
|
|
Mar 11 2015, 06:12
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата main() это главная программа в С. .... Обычно все это делает ассемлерная программка типично именуемая "startup" или похоже. Она то и располагается по ресет вектору. Все сделает, обнулит озу, установит константы, а потом перейдет на мейн. Это понятно, у меня вопрос вы когда последний раз писали или хотя бы правили startup? Я так сейчас оглядываюсь года 3, если не 5 я к нему не притрагивался. А я еще заморачиваюсь, сейчас народ на Cube и прочие библиотеки смотрит все с большим удовольствием. Потому у меня мнение что надо менять философию и уже считать что нижний уровень погиб, работать на уровень выше. И программу делать на этом уровне абстракции, то есть считать зануленые переменные данностью, которую мы не можем победить. И следовательно совершать какие-то доп действия, как минимум. А как максимум еще и не использовать очевидное свойство возможного сохранения памяти. Где гарантия что все так останется, нет документации - нет свойства! Цитата сценарий. перевели в обновление прошивки, перезагрузка, определили что остаться в бутлоадере начали грузить прошивку - сбой питания старт после отключения питания и что будет с флажком и признаком перезагрузки? Вы тысячу раз правы. Кончено этоа проблема решается своеобразным костылем - можно сделать два признака перепрошивки - один - это флажок, устанавливаемый внутри основной программы, второй признак - это если перепрошить хочет компьютер. То есть запускаешь программу, включаешь устройство. Бутлодер видит отсутствие флажка, но по USART к нему поступают предложения руки и сердц- значит надо давать согласие))) Цитата Вопрос - чисто для себя, представив, что ради флажка затирать целый сектор не очень хочется. если уж очень жаба душить затереть один из 15 неиспользуемых секторов, то можно поставить внешнюю FRAM:) маленькую, заодно там и параметры настроек хранить удобнее. Цитата Можно ли запускать в бутлодере сторожевой таймер, а проверять его в основной программе? Если основная программа не заработала, то сторожевой таймер инициирует перепрошивку? Можно, конечно, вопрос во всех ли процах есть флаг что ресет от сторожевика? Ну и опять же что делать если программа заработала, но не так как хотели?...
|
|
|
|
|
Mar 11 2015, 06:58
|
Гуру
     
Группа: Свой
Сообщений: 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(); }
|
|
|
|
|
Mar 11 2015, 07:04
|
Гуру
     
Группа: Свой
Сообщений: 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? Я частенько его правлю. А что? Это такая-же часть ПО, как и все остальные.
|
|
|
|
|
Mar 11 2015, 07:27
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Господа, а я придумал как обойтись без флага. Лично я вижу идеальный алгоритм такой: 1. Старт бутлодера 2. Проверка, не стучится ли комп по USART с предложением перепрошивки. Запуск функции прошивания в бутлодере по требованию компа - это на случай, если мы имеем битую прошивку, отсутствующий по этой причине флаг перепрошивки и бутлодер, который не ведая о беде, завершает свою работу и посылает контроллер по адресу битой прошивки. В этом случае мы используем одну и ту же кодовую команду USART - если ее словил бутлодер - запускаем прошивание, если ее словила основная программа то она инициирует перезагрузку. Заметьте - без всяких флагов. Уж если на компе запущен софт, шлющий по USAR запрос о перепрошивке, то бутлодер тоже словит эту команду. 3. Нет запроса по USART - делаем проверку - вдруг прошивка бита, а мужики-то не знают... Проверяем прошивку и если там беда - остаемся в бутлодере и, скажем, мигаем светодиодом.
P.S. Кстати, вот только сейчас задумался, а почеу это мы так зациклились на этом флаге? Он нужен был бы в том случае, если бы решение о необходимости прошивки принимал сам контроллер. Но ведь принимает его человек. И человек запускает на компе программу, а программу можно настроить как душе угодно. От контроллера требуется только две вещи - в бутлодере - понять, что нужно прошиваться, в основной программе - понять, что нужно перезагрузиться.
Может быть в моих рассуждениях есть изъян?
|
|
|
|
|
Mar 11 2015, 08:07
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Salamander @ Mar 11 2015, 10:27)  P.S. Кстати, вот только сейчас задумался, а почеу это мы так зациклились на этом флаге? Он нужен был бы в том случае, если бы решение о необходимости прошивки принимал сам контроллер. Но ведь принимает его человек. И человек запускает на компе программу, а программу можно настроить как душе угодно. От контроллера требуется только две вещи - в бутлодере - понять, что нужно прошиваться, в основной программе - понять, что нужно перезагрузиться. Удалённая перепрошивка. Представьте, что устройство на далёком объекте и подключено к Ethernet. Ехать к нему надо на вертолётах, оленях и собачьих упряжках. Вот там флаги и нужны.
|
|
|
|
|
Mar 11 2015, 08:42
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(Сергей Борщ @ Mar 11 2015, 11:14)  Вот вы и докопались до сути, отсеяв шелуху. Основная программа может понять по команде "начинаем обновлять прошивку" извне, а загрузчик - по флагу "программный сброс" в регистре RCC->CSR. И не нужны никакие дополнительные кнопки и паузы ожидания после включения. Неправда ваша. Представьте себе, что был сбой птания при перепрошивке. Флага не будет. Основной программе кранты. Бутлодер информацию о том, что нужно перепрошиться, никогда не получит. Спасет только упомянутая выше собачья упряжка. То есть Ваш вариант абсолютно не предусматривает битой прошивки. Бутлодер на мой взгляд должен знать, что в основную программу лезть нельзя, а еще должен уметь запустить прошивку ориентируюсяь не на внутренние флги, а на команды извне. Цитата Удалённая перепрошивка. Представьте, что устройство на далёком объекте и подключено к Ethernet. Ехать к нему надо на вертолётах, оленях и собачьих упряжках. Вот там флаги и нужны. У меня ситуация еще сложнее - ни одна собачья упряжке не угонится за вращающейся деталью, на которой закреплен контроллер)) Мой предыдущий абзац справедлив по отношению к вашим словам тоже. Гарантированность флагов не 100%. В то же время есть Ethernet, по которму мы переправляем прошивку, почему бы не направлять поэтому каналу команды и не сделать бутлодер посговорчивей. Посмотрим также на это с другой стороны - если озвученный мной механизм реализован, то какая надобность во флагах?
|
|
|
|
|
Mar 11 2015, 09:07
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(aaarrr @ Mar 11 2015, 11:52)  Любой вменяемый бут обязан посчитать CRC основной программы перед стартом. Ох... опять по кругу. Я же уже писал выше, что исхожу из замечания человека, сомневаться в компетенции которого не имею морального права. А именно - товарищ Golikov A писал Цитата а дальше как биты лягут, пойдет такое дело и окажется битая прошивка с нормальным кодом и контрольной суммой, и вот вам здрасте приехали - кирпич. Ну не суть важно, работающий у меня пример от ST содержит фрагмент, который вроде бы проверяет контрольную сумму. Вы мне объясните, предложенный мной механим позволит обойтись без флагов во Flash?
|
|
|
|
|
Mar 11 2015, 09:44
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 11 2015, 09:56
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
В вашем случае да, вы по UART можете долбить командой перепрошивки до тех пор пока не получите ответ что готовы перепрошивать. Есть одна сложность если контроллер загрузиться в середине вашей команды, то он может получить не верные данные, но это детали... можно побороть. А если езернет и на далекой планете, то какой таймаут надо дело чтобы гарантированно бутлоадер словил пакет начала перепрошивки? Пинги бывают крайне долгими. И если не хочется ждать долгую паузу на принятие решения - то флаг надежнее... Цитата Любой вменяемый бут обязан посчитать CRC основной программы перед стартом. Цитата И не нужны никакие дополнительные кнопки и паузы ожидания после включения. И вот тут у меня есть поучительная история, в ходе каких-то тестов и разбирательств, закоментили функцию старта бутлоадера из основной программы, и прошили эту прошивку, дальше что? Зачем мы делаем удаленную смену прошивки? На случай возможных ошибок, я так понимаю это в 95% случаев. Есть конечно варианты модернизации, но все же исправление ошибок по мне более вероятный сценарий. И почему мы тогда исключаем добавление новых ошибок во время исправления старых? Да кнопка не удобно, да надо идти к устройству, но все же это надежно на 150% что бы вы ни сделали, а кнопка останется. Правда, есть еще вариант затирания бутлоадера из основной программы  , но на этот случай у нас кнопка встроенного загрузчика и уарт выведен.. Мы старались обеспечить максимум возможностей чтобы пользователь в итоге не остался с неработающим устройством в ожидании специалистов с другого края света с приборами для смены прошивки... Особо любимые клиенты с интернетом решат свои проблемы в течение часа%) Но тут все как всегда не четко, всегда есть компромиссы, в нашем случае такой вариант показался наиболее правильным.
|
|
|
|
|
Mar 11 2015, 09:59
|
Гуру
     
Группа: Свой
Сообщений: 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 по кнопке.
|
|
|
|
|
Mar 11 2015, 10:46
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

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

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

|
Цитата(Golikov A. @ Mar 11 2015, 01:12)  Это понятно, у меня вопрос вы когда последний раз писали или хотя бы правили startup? ...
Потому у меня мнение что надо менять философию и уже считать что нижний уровень погиб, работать на уровень выше. И программу делать на этом уровне абстракции, то есть считать зануленые переменные данностью, которую мы не можем победить. И следовательно совершать какие-то доп действия, как минимум. А как максимум еще и не использовать очевидное свойство возможного сохранения памяти. Где гарантия что все так останется, нет документации - нет свойства!
... А зачем его править? Я же написал английским по белому: __no_init объявление в С программе делает то, что надо. У меня без CRC: есть флажок в EEPROM: "программа годная, хорошая". По старту всегда стартует бутлоадер, который смотрит есть ли этот флаг, если есть, то делает проверку, хочет ли кто загрузить фирмварь, нет - прыгает на основную программу. Если флага нет, никуда прыгать не будет. Будет ждать аплоада фирмваря. Аплоад фирмваря заключается в а) стирании флага; б) аплоада и в) прыжка на эту программу после аплоада. Если аплоад не получился по какойто причине, прыжка не будет, будет опять пытатся сделать аплоад. Главная программа стартует, инициализируется, проверяет че надо, и если флажок не стоит, записывает его.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Mar 11 2015, 20:23
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Salamander @ Mar 11 2015, 13:46)  Но если очень хочется нажать, то можно))) Если не боитесь программить - то ышо один вариант - хранить во флеше более одной рабочей прошивки. Для AVR без проблем делается делением лапополам и вся недолга. С каждой заливкой чередуются верхняя половинка/нижняя. Прошивка пишется с последнего сектора. Последним прошивается таблица векторов. Т.к. сектор записи больше чем таблица векторов - то за таблицей можно расположить служебную инфу. Типа номер прошивки и иже. Чтоб не было камня - достаточно обеспечить стабильность работы в течении записи одного всего сектора. Для ARMов - ещё просче. Можно сделать весь софт сегментным и ввести логику фулл, диф, инкрементальной версии по модульно. Софт будет сам себя писать и в добавок у вас в камне более одной рабочей прошивки. В случае сбоя - вы получаете кусок сбойной записи, которая при старте камня никак не будет детектироватья (нет црц и иже). Если ошибка софта - то статистика успешных отработок даёт ответ на вопрос целесообразности работы в той или иной конфигурации загрузки. Почему "если не боитесь" - замороты с адресацией. везде косвенная. Что не всегда поддерживают на ура компиляторы. Особенно когда кода больше чем ближний(оптимизированный) переход. Ослинные уши вылазят в основном на языках си и выше. На армах юзаю IAR - грешен в нём так-же компилятор  Посему системы записи места краша программы - актуально выходит на первое место. Ну и скидывания причины в удобный вид. Отсюда понятно - что в системе должен быть как минимум накопитель (к примеру микро сд). Но можно
|
|
|
|
|
Mar 12 2015, 06:56
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(kolobok0 @ Mar 11 2015, 23:23)  Если не боитесь программить - то ышо один вариант - хранить во флеше более одной рабочей прошивки. Да и зачем?? Если бутлодырь "правильный", то перезальет любую кривозалитую прошивку, а все эти дубли и пр, только усложняют прогу и уменьшают объем флешки... Если уж бутлодырь кривой, то и 3 копии не помогут, проверял на собственном опыте, лучше делать больше вариантов прошивки в буте, например, флешка, уарт, а если нужно удаленно - сеть...
|
|
|
|
|
Mar 14 2015, 07:23
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Хм... опять что-то нездравое творится. Я залил бутлодер, предложенный 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
Сообщение отредактировал Salamander - Mar 14 2015, 07:01
|
|
|
|
|
Mar 14 2015, 12:24
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Ну не знаю, я так понял, что у вас вообще не грузилась основная программа. А у меня она грузится, если прошить Keil и перезапустить. А если прошить bootloaderом - то не грузится. Вопрос - Keil у меня грузит в контроллер файл axf. Бутлодеру я подсовываю hex. Есть предположение, что как-то неправильно генерируется hex. Чтобы проверить это - как мне заставить Keil отправить в контроллер hex файл?
Еще вопрос - окно Memory что показывает - Flash или Ram?
///////////////
Разобрался как подсунуть HEX - Keil шьет его нормально....
В настройках Keil есть пункт IROM - в нем 2 поля, первое эт старт - 0x8003000, с ним все понятно. ВТорое - size 0x80000. Что-то я не нашел в коде бутлодера, где было бы такое значение, значит оно не учитывается бутлодером?
Залил по очереди прошивки - кейлом и бутлодером. Скачал по очереди, в HEX редакторе сравнил. Идентичны до адреса 0x00007477 (это смещение от 0x800....) Дальше каждый байт различен....
Сообщение отредактировал Salamander - Mar 14 2015, 11:24
|
|
|
|
|
Mar 14 2015, 13:15
|

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

|
Цитата(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); }
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|