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

 
 
9 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Как программно загнать STM32 в бутлоадер?
Salamander
сообщение Mar 7 2015, 17:00
Сообщение #1


Местный
***

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



На AVR все делалось просто - загрузчик запускался первым и по таймауту отдавал управление основной программе. А в тексте основной программы некая функция слушала USART и по определенной команде перезагружала контроллер.
А как в STM - ну подам я на BOOT0 единичку - ее же нужно держать какое-то время после Reset.
Я хочу прошивать дистанционно - по bluetooth (hс-05)
Go to the top of the page
 
+Quote Post
smalcom
сообщение Mar 7 2015, 17:19
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



программно никак. используйте одновибратор на ножках BOOTx
Go to the top of the page
 
+Quote Post
Porty
сообщение Mar 7 2015, 17:20
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893



Цитата(Salamander @ Mar 7 2015, 21:00) *
На AVR все делалось просто - загрузчик запускался первым и по таймауту отдавал управление основной программе. А в тексте основной программы некая функция слушала USART и по определенной команде перезагружала контроллер.
А как в STM - ну подам я на BOOT0 единичку - ее же нужно держать какое-то время после Reset.
Я хочу прошивать дистанционно - по bluetooth (hс-05)

может задержать BOOT0 на RC цепочке?
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 17:25
Сообщение #4


Местный
***

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



Цитата(smalcom @ Mar 7 2015, 20:19) *
программно никак. используйте одновибратор на ножках BOOTx

А какова длительность импульса?
Go to the top of the page
 
+Quote Post
smalcom
сообщение Mar 7 2015, 17:54
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Цитата(Salamander @ Mar 7 2015, 19:25) *
А какова длительность импульса?


Это вам решать, вы же программу пишите. По доке: смотрите сколько необходимо сохранять требуемый уровень на BOOTx после перевода nRESET в неактивное состояние.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 7 2015, 18:08
Сообщение #6


Гуру
******

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



Самодельный загрузчик кошернее.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 18:29
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 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...
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 7 2015, 18:50
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Salamander @ Mar 7 2015, 20:00) *
На AVR все делалось просто - загрузчик запускался первым и по таймауту отдавал управление основной программе.


Что мешает то же самое сделать на СТМ?? В авр-же сами писали загрузчик. Не умеете писать загрузчики на стм? Возьмите готовый в аппнотах...



Сообщение отредактировал mantech - Mar 7 2015, 18:53
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 18:53
Сообщение #9


Местный
***

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



Так в AVR не было специального пина, все делалось ручками - пинаешь контроллер по адресу и все. Я усомнился, что так вожно в STM, поскольку у него для этого есть железная ножка. А задав вопрос здесь, услышал "программно никак".
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 7 2015, 18:59
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Salamander @ Mar 7 2015, 21:53) *
Я усомнился, что так вожно в STM, поскольку у него для этого есть железная ножка. А задав вопрос здесь, услышал "программно никак".


Я просто вообще не понимаю, зачем дрыгать какими-то ножками, если все можно сделать программно?? Кто сказал, что "программно никак"?? Всегда делал программно - стартует буллоадер, опрашивает, есть-ли варианты загрузки, если нет, переопределяем контр. прерываний и на адрес основной проги. В основной проге сбрасываем собаку, а если надо рестартануть - не сбрасываем и все!!
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 7 2015, 19:02
Сообщение #11


Гуру
******

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



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

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

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

ножка - это не ограничение а доп фишка, используя ее, данные загрузки надо будет слать в специальном формате, ваш блютус с этим справиться?
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 19:12
Сообщение #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 года назад как-то так делал...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 7 2015, 19:12
Сообщение #13


Гуру
******

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



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


Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 7 2015, 19:13
Сообщение #14


Гуру
******

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



Цитата(Salamander @ Mar 7 2015, 22:11) *
ЗАчем мне писать загрузчик, если он уже есть внутри STM32

Для расширения кругозора?
Ну или для того, чтобы он снял все ограничения, присущие заводскому загрузчику, и добавил кучу полезных плюшек.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 7 2015, 19:18
Сообщение #15


Гуру
******

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



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


правильно делается так.

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


Когда вы хотите обновить прошивку из программы, вы ставите флаг обновления и перегружаетесь, после этого запуститься бутлоадер и по 1 условию останется ждать прошивку, а когда обновите прошивку, просто снимаете флаг, и опять перегружаетесь...


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


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

Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 19:19
Сообщение #16


Местный
***

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



Цитата(Golikov A. @ Mar 7 2015, 22:12) *
Ну тогда вам стоит написать бутлоадер хотя бы для того чтобы "не жать на кнопку Boot0."

А... я начинаю понимать. "свой" бутлодер - это не свой вариант кода, которым мы затираем заводской бутлодер, а дополнительная программа, которая располагается в начальном адресе памяти? Заводской бутлодер никуда не девается, и по прежнему может вызываться кнопкоу boot, но мы им просто не пользуемся. Я правильно понял?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 7 2015, 19:23
Сообщение #17


Гуру
******

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



да, аминьsm.gif

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



ну есть еще вариант, можно между блютусом и процом вставить ЦПЛД или маленький контроллер, который получив правильную последовательность сформирует перегрузку боевого проца с ножкой бут), процы нынче не дороги, а программа на этом маленьком проце не измена... но это ИМХО как-то через одно место)
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 19:23
Сообщение #18


Местный
***

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



Цитата(Golikov A. @ Mar 7 2015, 22:21) *
да, аминьsm.gif

алилуйа...
Ну зачем же менято было пугать вторым постом?

Побегал по настройкам Keil... Скажите, а можно ли как-то все это настроить, чтобы все так же шить через KEIL? Ну как будто у меня контроллер через Jtag шьется (я понимаю, что отладка невозможна). То есть нажал в KEIL кнопку прошивки, он через USART и залил?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 7 2015, 19:26
Сообщение #19


Гуру
******

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



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

Тем более у нас в некоторых продуктах прошивка скрыта от пользователя. То есть он просто запускает программу управления на компьютере, а она сама проверяет если железо старое, меняет ему прошивку, пользователь даже не знает что там было...
Так что в производстве можно даже прогу не лить, просто грузишь загрузчик, он как раз заливается кейлом по жетагу. И все, дальше при первом включении плата приобритет необходимую прошивку.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 19:49
Сообщение #20


Местный
***

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



Цитата(Golikov A. @ Mar 7 2015, 22:26) *
Ну наверное как-то можно...
Но я прикинул что на выяснения как у меня уйдет больше времени чем на написание внешнего терминальчика.

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


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

Поиски бутлодера под KEIL привели только к примеру под STM8...
Кто-нибудь ткнет носом, где скачать?
Go to the top of the page
 
+Quote Post
AVNN
сообщение Mar 7 2015, 19:51
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 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-ках возможно что-то подобное можно сделать.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 19:58
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 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. То есть, если ставить брейкпоинт на эту строку, отладчик его ловит, если на следюущую - не ловит.
Go to the top of the page
 
+Quote Post
AVNN
сообщение Mar 7 2015, 20:12
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 20:16
Сообщение #24


Местный
***

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



мне это ни о чем не говорит.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 7 2015, 20:25
Сообщение #25


Гуру
******

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



Вот так кошернее:
Код
static const uint16_t jump2fw[] =
{
        0xF850, 0xDB04, /* LDR.W SP, [R0], #4   */
        0x6800,         /* LDR.W R0, [R0]       */
        0x4700,         /* BX R0                */
};

((void (*)(int))(1 + (int)jump2fw))(0x1FFF0000);
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 20:53
Сообщение #26


Местный
***

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



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

Останавилваю отладчик - дизассемблер вот что показывает
0x080001D6 E7FE B HardFault_Handler (0x080001D6)WEAK]

У 103 серии адрес другой - 0x1FFFF000
Теперь не вылетает в HardFault. Лазит где-то...
Но Flashloader контакт не устанавилвает. Вообще он глючный какой-то - он и при нажатии boot0 через раз коннектится..
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Mar 7 2015, 21:10
Сообщение #27


Знающий
****

Группа: Участник
Сообщений: 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.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 22:06
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 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, то без переписывания бутлодера ее не выключишь. И сколько не перезагружай контроллер - он все время будет в загрузчик залетать.

Кто-нибудь из присутствующих может реально в железе попробовать программно запустить встроенный загрузчик?

Что-то безрезультатно....
Go to the top of the page
 
+Quote Post
Aner
сообщение Mar 7 2015, 22:29
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 4 869
Регистрация: 28-02-08
Из: СПБ
Пользователь №: 35 463



Прошивать дистанционно без написания собственного загрузчика нереально, программно запустить встроенный загрузчик низя.
Еслиб было можно то что тогда ...? В том то и дело.
А все железные приблуды с удержанием, загонят случайно в загрузчик и что тогда? Только ресет, а где его взять дистанционно, аппататный? Нигде, придется ехать за сотню км и перегружать железку, неправильно это.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 7 2015, 23:13
Сообщение #30


Местный
***

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



ОК, хочу пример загрузчика под KEIL
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 8 2015, 05:45
Сообщение #31


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

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



Одни утверждают, что нельзя программно запрыгнуть в системный загрузчик, другие приводят программу, которая скачэ... Чудеса. Попробую сам. Не вижу принципиальных трудностей. Узнать адрес, и гоу ту... Ножки бута нужны, чтобы сразу перенестись в загрузчик при старте, только и всего.
Salamander, вы не поняли. В таблице два указан адрес идентификатора загрузчика. Это не обязательно. Мы и так знаем, какой загрузчик в мк. И адрес загрузчика всегда конкретный, описан в разделах микроконтроллеров.
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 8 2015, 06:19
Сообщение #32


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(ViKo @ Mar 8 2015, 08:45) *
Одни утверждают, что нельзя программно запрыгнуть в системный загрузчик, другие приводят программу, которая скачэ... Чудеса. Попробую сам. Не вижу принципиальных трудностей. Узнать адрес, и гоу ту... Ножки бута нужны, чтобы сразу перенестись в загрузчик при старте, только и всего.


Дак в этом и есть прелесть самописого бутлодыря - то, что он сперва сам запускается, даже если прога вообще еще не загружена, причем никаких ногодрыгов и т.п.
Как вы будете "запрыгивать" в стшный загрузчик, если прога еще не загружена??
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 8 2015, 06:58
Сообщение #33


Гуру
******

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



Цитата
Не вижу принципиальных трудностей. Узнать адрес, и гоу ту... Ножки бута нужны, чтобы сразу перенестись в загрузчик при старте, только и всего.

думаю зависит от реализации...

Вон в LPC1768 и семействе ножка бут подменяет 0 регион, с векторами прерывания и прочее... Тут об Гоу тушишься, а загрузчика просто нет пока ногой не подергал.
Так что думаю не всегда можно просто перепрыгнуть по адресу.

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


Go to the top of the page
 
+Quote Post
Integro
сообщение Mar 8 2015, 07:13
Сообщение #34


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

Группа: Свой
Сообщений: 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 сделать джамп до инита железа.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 8 2015, 08:45
Сообщение #35


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 8 2015, 09:19
Сообщение #36


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Salamander @ Mar 8 2015, 11:45) *
Все-таки свой бутлодер буду писать. И свой софт.

Да елки - нигде не могу найти исходник бутлодера. Они существуют в природе?


Ну вот хоть правильное решение!



Сообщение отредактировал mantech - Mar 8 2015, 09:23
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 8 2015, 09:25
Сообщение #37


Гуру
******

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



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

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

Цитата
Все-таки свой бутлодер буду писать. И свой софт.

это правильно


собственно вам надо написать программу которая кладет пришедшие данные во флэшь и запускает программу по новому адресу.

http://www.st.com/st-web-ui/static/active/...rchtype=keyword

то есть вам надо на самом деле найти 2 документа запись данных во флэш
и запуск прошивки с произвольного адреса.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 8 2015, 09:41
Сообщение #38


Гуру
******

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



Цитата(Salamander @ Mar 8 2015, 11:45) *
Да елки - нигде не могу найти исходник бутлодера. Они существуют в природе?

Прикладываю реальный загрузчик для STM32. Грузит прошивку через TFTP с буфером во внешней SPI flash памяти.
Прикрепленные файлы
Прикрепленный файл  bootloader.zip ( 76.54 килобайт ) Кол-во скачиваний: 90
 
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 8 2015, 09:52
Сообщение #39


Местный
***

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



Цитата(scifi @ Mar 8 2015, 12:41) *
Прикладываю реальный загрузчик для STM32. Грузит прошивку через TFTP с буфером во внешней SPI flash памяти.

Ох и наворочено....
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 8 2015, 09:56
Сообщение #40


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(scifi @ Mar 8 2015, 12:41) *
Прикладываю реальный загрузчик для STM32. Грузит прошивку через TFTP с буфером во внешней SPI flash памяти.


Зачем такие навороты, когда есть первоисточник, там все куда проще: STSW-STM32068

http://www.st.com/web/en/catalog/tools/FM1...chtype=keyword#
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 8 2015, 09:57
Сообщение #41


Гуру
******

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



Цитата(Salamander @ Mar 8 2015, 12:52) *
Ох и наворочено....

Любой загрузчик, делающий чуть больше, чем "два байта переслать", будет "навороченным". Никуда от этого не деться...
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 8 2015, 11:00
Сообщение #42


Местный
***

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



Цитата(scifi @ Mar 8 2015, 12:57) *
Любой загрузчик, делающий чуть больше, чем "два байта переслать", будет "навороченным". Никуда от этого не деться...

Да не скажите.
Вот нашел первоисточник от ST - более или менее понятно.
http://www.st.com/web/en/catalog/tools/FM1...chtype=keyword#
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 8 2015, 12:53
Сообщение #43


Местный
***

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



Вопрос: вот работает у меня программа, анализирует поток поступающих по USART данных. Получает команду на перепрошивку. Прыгает на бутлоадер. Бутлоадер должен проанализаровать некий флаг и понять, что нужна перепрошивка...
А можно сделать так - записать бутлодер в конец адресного пространства, а основную программу как обычно. И основная программа в случае необходимости прыгает по адресу бутлодера. А по окончанию загрузки просто ресетит контроллер.
ЧТо скажете по поводу такой схемы?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 8 2015, 13:27
Сообщение #44


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

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



Цитата(Salamander @ Mar 8 2015, 15:53) *
ЧТо скажете по поводу такой схемы?

Плохо тем, что, например, для STM32F2xx старшие адреса разбиты на сектора по 128 kB, а младшие - всего по 16 kB. Стирать нужно целый сектор. Нормально, когда загрузчик размещен в отдельном секторе, чтобы не стирать его при перепрошивке. Поэтому загрузчик в секторе 0 предпочтительнее.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 8 2015, 14:43
Сообщение #45


Местный
***

Группа: Участник
Сообщений: 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 контроллируется, и если она равна единичке, то запускается прошивка, если нет передается управление основной программе.

Я понимаю всю наивность моей попытки дать одинаковое имя переменной в разных программах и расчитывать, что она будет видна в обоих. Но попробовать надо было. Не получилось.
Как мне в основной программе записать флажок, чтобы этот флажок был виден в бутлодыре?
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 8 2015, 16:56
Сообщение #46


Местный
***

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



Может быть можно расположить переменную по фиксированному адресу? Как это сделать?

Ау?

Сообщение отредактировал Salamander - Mar 8 2015, 16:30
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 8 2015, 17:08
Сообщение #47


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

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



Добавить к переменной атрибут __attribute((at(0x08020000)))
Go to the top of the page
 
+Quote Post
x893
сообщение Mar 8 2015, 17:11
Сообщение #48


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



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

Сообщение отредактировал x893 - Mar 8 2015, 17:11
Go to the top of the page
 
+Quote Post
hlebn
сообщение Mar 8 2015, 17:32
Сообщение #49


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

Группа: Свой
Сообщений: 131
Регистрация: 22-10-04
Пользователь №: 963



у меня для stm32f407 обновление через стандартный лоадер так:

static void BootLoader()
{
void (*SysBootLoaderJmp)(void)=(void (*)(void))(*((uint32_t *)0x1fff0004));
__set_PRIMASK(1);
RCC_DeInit();
SysTick->CTRL=0;
SysTick->LOAD=0;
SysTick->VAL=0;
__set_PRIMASK(1);
__set_MSP(*((uint32_t *)0x1fff0000));
SysBootLoaderJmp();
while(1);
}
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 8 2015, 18:25
Сообщение #50


Местный
***

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



Цитата(ViKo @ Mar 8 2015, 21:08) *
Добавить к переменной атрибут __attribute((at(0x08020000)))
.
Спасибо, а я хотел бы еще так для себя поинтересоваться, а если в процессе компиляции компилятор присвоит какой-либо переменной некий адрес, а потом я в конце захочу указанным атрибутом этот же адрес присвоить другой переменной? Что будет? Или компилятор в первую очередь распределяет явно указанные адреса?




Погодите... но если я в бутлодере напишу __attribute((at(0x08020000))) то эта переменная очистится...
Как решить задачу?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 8 2015, 20:13
Сообщение #51


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

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



Цитата(Salamander @ Mar 8 2015, 21:25) *
а я хотел бы еще так для себя поинтересоваться, а если в процессе компиляции компилятор присвоит какой-либо переменной некий адрес, а потом я в конце захочу указанным атрибутом этот же адрес присвоить другой переменной? Что будет? Или компилятор в первую очередь распределяет явно указанные адреса?

Если конкретный адрес задан, то компилятор туда ничего от себя не поместит.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 8 2015, 20:29
Сообщение #52


Гуру
******

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



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

Флажка тут мало: он может и случайно оказаться равен 1. Используйте 32 битное слово с каким-нибудь нетривиальным значением.
Передать есть несколько способов (в порядке нарастания сложности):
1. Записать в какой-нибудь периферийный scratchpad-регистр (скажем, регистры ключа AES у вашего процессора).
2. "Спрятать" кусочек RAM от линкера, и писать-читать по указателю.
3. Определить честную секцию с фиксированным адресом для хранения флага. Со стороны загрузчика она должна иметь какой-нибудь атрибут типа "no init", иначе при старте будет затерта нулями.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 8 2015, 20:41
Сообщение #53


Местный
***

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



Хитро.... Я уж лучше как изначально задумывал - на HC-05 ножки буду зажигать.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 9 2015, 00:24
Сообщение #54


Местный
***

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



Тему почти можно закрывать. С ножками от HC-05 все получилось.
В C++ Builder проект добавил VCL, обеспечивающий передачу по протоколу YModem. Вроде бы коннект состоялся, но я ему подсунул какую-то лабуду и конечный результат не оценивал.
Остается дождаться, когда китайские братья пришлют еще один HC-05 и попробовать осуществить полноценную прошивку по воздуху
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 9 2015, 06:18
Сообщение #55


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Salamander @ Mar 9 2015, 03:24) *
Остается дождаться, когда китайские братья пришлют еще один HC-05 и попробовать осуществить полноценную прошивку по воздуху


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

Сообщение отредактировал mantech - Mar 9 2015, 06:19
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 9 2015, 09:13
Сообщение #56


Гуру
******

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



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

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

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 9 2015, 09:22
Сообщение #57


Гуру
******

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



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

Зачем через флеш?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 9 2015, 09:55
Сообщение #58


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

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



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

Они и есть Target-ы. Недавно спрашивали, зачем они. А вот зачем. rolleyes.gif
Лично мне из основной программы в загрузчик выходить не надо. У меня есть выключатель питания, так и попаду в сброс. Ах... флажок... Да, это можно использовать. Установил флажок, сбросился, дождался прошивки, прошился, сбросил флажок. А если не дождался, по таймауту время отсчитал, сбросил флажок, ушел в основную программу.
Размещу флажок в Backup RAM, она у меня от батарейки питается. Тогда и сброс можно делать, как хочешь.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 9 2015, 09:56
Сообщение #59


Гуру
******

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



Цитата(aaarrr @ Mar 9 2015, 12:22) *
Зачем через флеш?

Просто он так сделал, у него заработало, и менять не стал.
Конечно, нужно проверять регистр причины сброса, и если сброс программный, то проверять флаг в ОЗУ.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 9 2015, 13:41
Сообщение #60


Местный
***

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



Ух... только сейчас отладил всю цепочку переключений и обратно. У блютус модуля определенная задержка была при включении PIO, а я не мог понять приичны неустойчивости работы.
Буду теперь YModem из наколенного состояния перепиливать в удобоваримое.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 9 2015, 20:34
Сообщение #61


Гуру
******

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



Цитата
Зачем через флеш?


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


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

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

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

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

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

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

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

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

переключил, и куча флажков и настроек встали одним движением в нормальное состояние...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 10 2015, 05:00
Сообщение #62


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

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



2 Golikov A.
А как это, задать бит во флэш? Целый сектор памяти стирать-программировать...
Таргеты - да, здорово расписали. Опции компилятора переключить мне не сложно, отладкой по ком-порту не пользуюсь, а вот дефайны - да, их же можно задать в свойствах проекта! Правда, отладочных дефайнов у меня с десяток...
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 10 2015, 07:09
Сообщение #63


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Golikov A. @ Mar 9 2015, 23:34) *
А то что при отладке через жетаг для правильного хождения по командам надо иметь уровень оптимизации 0


Это еще зачем?? Всегда выставлял Full optimization под IAR. Зачем чего-то отлаживать на том уровне, который все-равно не будет в релизе?? По первости делал без оптимизации, вроде все работает, потом выставляю фулл - и "привет", висим и все тут...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 10 2015, 07:26
Сообщение #64


Гуру
******

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



Цитата
А как это, задать бит во флэш? Целый сектор памяти стирать-программировать...

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

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

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


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

Ну и в тему таргетов, не забываем что это может быть реально один проект под разные процы, и там определяется дефайны и свойства проца.... Хотя это конечно тяжелоsm.gif
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 10 2015, 07:32
Сообщение #65


Гуру
******

Группа: Участник
Сообщений: 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шнински получается - или по-русски "черт ногу сломит" biggrin.gif
Go to the top of the page
 
+Quote Post
swisst
сообщение Mar 10 2015, 13:20
Сообщение #66


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

Группа: Свой
Сообщений: 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 ?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 10 2015, 13:36
Сообщение #67


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

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



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

И если ни один из них не установлен, тогда какой был сброс? rolleyes.gif
Go to the top of the page
 
+Quote Post
swisst
сообщение Mar 10 2015, 13:53
Сообщение #68


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

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



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


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

вопрос с передачей флага "нужно прошиваться" через SRAM актуален
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Mar 10 2015, 13:56
Сообщение #69


Знающий
****

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



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


Таких документов много. Но сама программа, как правило прежде чем дойдет до main()
установит озу в нужное состояние. Чтобы этого не было, в IAR, например надо добавлять __no_init
перед обьявлением переменной.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 10 2015, 15:18
Сообщение #70


Гуру
******

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



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

Наверное, не написано, но это и так все знают biggrin.gif
Нужно очень постараться, чтобы затереть статическое ОЗУ одномоментно, не снимая питание.
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 10 2015, 15:41
Сообщение #71


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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


Ну сами подумайте, у статики нет инициализации и тактировки, как у динамики, затереть ее может только сама программа, да и то, если не используете монитор питания.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 10 2015, 20:44
Сообщение #72


Гуру
******

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



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

Я не люблю использовать фишки, которые явно не описаны в документации, как минимум это дает мне право искренне возмущаться "а че не работает то?", нежели если недокументированное юзать...
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 10 2015, 20:52
Сообщение #73


Гуру
******

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



Цитата(Golikov A. @ Mar 10 2015, 23:44) *
а как при старте инициализируемые 0 переменные становятся нулевыми?

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

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

Примеры - в студию! Это будет открытие века!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 10 2015, 20:52
Сообщение #74


Гуру
******

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



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

Программно. Сброса нет. Если бы вдруг был, непременно бы такую фишку задокументировали, не сомневайтесь sm.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 10 2015, 21:38
Сообщение #75


Гуру
******

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



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


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

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

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

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

жаль.... sm.gif
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Mar 11 2015, 01:35
Сообщение #76


Знающий
****

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



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

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


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


Местный
***

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



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

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

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


Гуру
******

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



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


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

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



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

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

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


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

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


Гуру
******

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



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

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

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

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


Гуру
******

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



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

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

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

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

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


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

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



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


Местный
***

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



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

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

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


Гуру
******

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



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

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


Гуру
******

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



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


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


Местный
***

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



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


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

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

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


Гуру
******

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



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

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


Местный
***

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



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

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


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


Гуру
******

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



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


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


Гуру
******

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



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

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

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

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

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

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

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


Гуру
******

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



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

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

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

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

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

А для таких случаев делаем режим recovery по кнопке.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 11 2015, 10:00
Сообщение #91


Гуру
******

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



вот, так что кнопка нужна! sm.gif

Да те кто правит и пишет стартап перед каждым проектом, снимаю шляпу, вы вызываете уважение, я видать уже обленился, пользуюсь выданным)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 11 2015, 10:03
Сообщение #92


Гуру
******

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



Цитата(Golikov A. @ Mar 11 2015, 13:00) *
вот, так что кнопка нужна! sm.gif

Нужна, но не для того, чтобы на неё нажимать. Только для нештатных ситуаций.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 11 2015, 10:46
Сообщение #93


Местный
***

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



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


Но если очень хочется нажать, то можно)))
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Mar 11 2015, 13:26
Сообщение #94


Знающий
****

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



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


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

...

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


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

Главная программа стартует, инициализируется, проверяет че надо, и если флажок не стоит, записывает его.


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


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Salamander @ Mar 11 2015, 13:46) *
Но если очень хочется нажать, то можно)))



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

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

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

Но можно sm.gif
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 12 2015, 06:56
Сообщение #96


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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


Да и зачем?? Если бутлодырь "правильный", то перезальет любую кривозалитую прошивку, а все эти дубли и пр, только усложняют прогу и уменьшают объем флешки... Если уж бутлодырь кривой, то и 3 копии не помогут, проверял на собственном опыте, лучше делать больше вариантов прошивки в буте, например, флешка, уарт, а если нужно удаленно - сеть...
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 14 2015, 07:23
Сообщение #97


Местный
***

Группа: Участник
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  stsw_stm320081111.rar ( 3.62 мегабайт ) Кол-во скачиваний: 27
 
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 14 2015, 08:10
Сообщение #98


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

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



Вот здесь почитайте, может, даст толчок.
http://electronix.ru/forum/index.php?showt...t&p=1317836
У меня все заработало.
Go to the top of the page
 
+Quote Post
Salamander
сообщение Mar 14 2015, 12:24
Сообщение #99


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Mar 14 2015, 13:15
Сообщение #100


Знающий
****

Группа: Участник
Сообщений: 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);
}


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:40
Рейтинг@Mail.ru


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