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

 
 
> STM32 flash, помогите разобраться
dimka76
сообщение May 30 2014, 07:34
Сообщение #1


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



В документации написано что шина данных FLASH памяти у STM32 128-ми битная.
Но при этом в коде startup, где идет инициализация переменных в ОЗУ, копирование идет по 4 байта (32 бита) инструкции
Код
       ...
   ldr  r3, [r3, r1]
   str  r3, [r0, r1]
   adds  r1, r1, #4
       ...


У ST есть AppNote EEPROM emulation in STM32F10x microcontrollers, где при чтении из FLASH (виртуальной EEPROM) копируются 16-ти битные данные
Код
/**
  * @brief  Returns the last stored variable data, if found, which correspond to
  *   the passed virtual address
  * @param  VirtAddress: Variable virtual address
  * @param  Data: Global variable contains the read variable value
  * @retval Success or error status:
  *           - 0: if variable was found
  *           - 1: if the variable was not found
  *           - NO_VALID_PAGE: if no valid page was found.
  */
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)


Как же все-таки читается FLASH?
А если мне надо только один байт прочитать из FLASH ?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
7 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 91)
aaarrr
сообщение May 30 2014, 07:41
Сообщение #2


Гуру
******

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



Цитата(dimka76 @ May 30 2014, 15:44) *
Как же все-таки читается FLASH?

Как угодно: разрядность шины flash для ядра прозрачна.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 30 2014, 09:37
Сообщение #3


Гуру
******

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



Цитата(dimka76 @ May 30 2014, 15:44) *
В документации написано что шина данных FLASH памяти у STM32 128-ми битная.
...
Как же все-таки читается FLASH?
А если мне надо только один байт прочитать из FLASH ?

Процессор может свободно читать и один байт, и 32-разрядное слово. Грубо говоря, контроллер флэш подсовывает процессору из этих 128 бит только те, которые ему нужны. Всё это волшебство происходит автоматически и незаметно.

Цитата(dimka76 @ May 30 2014, 15:44) *
У ST есть AppNote EEPROM emulation in STM32F10x microcontrollers, где при чтении из FLASH (виртуальной EEPROM) копируются 16-ти битные данные

Запись - это совсем другая история. Обычно у флэш есть минимальная ячейка памяти, меньше которой записать нельзя. Для STM32F1 это 16 бит. Кстати, в семействах STM32F2 и STM32F4 флэш устроена иначе, и записывать можно даже 1 байт за раз, что открывает новые возможности для эмуляции EEPROM.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 30 2014, 14:23
Сообщение #4


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Спасибо всем ответившим.

Цитата(scifi @ May 30 2014, 17:47) *
Запись - это совсем другая история. Обычно у флэш есть минимальная ячейка памяти, меньше которой записать нельзя. Для STM32F1 это 16 бит. Кстати, в семействах STM32F2 и STM32F4 флэш устроена иначе, и записывать можно даже 1 байт за раз, что открывает новые возможности для эмуляции EEPROM.


Про запись я не спрашивал ;-)
А по поводу флэш в STM32F2xx очень полезное замечание, т.к. с ним и работаю. А указанный выше AppNote просто первым подвернулось, и я думал, что у всех STM32F память устроена одинакого.

Еще один вопрос.
Скомпилировал для STM32F2xx следующую строчку, где raw_data константы во флэш. Компилятор GCC.
Код
uint8_t    raw_data[118660] __attribute__ ((section (".ordata")));
uint8_t    appdata[10000];
for(i=0; i<10000UL; ++i) appdata[i] = raw_data[i];


И вот, что наблюдаю в листинге

Код
8001a6e:    f242 7410     movw    r4, #10000    
8001a72:    5cb8          ldrb    r0, [r7, r2]
8001a74:    6819          ldr    r1, [r3, #0]
8001a76:    f8df a20c     ldr.w    sl, [pc, #524]
8001a7a:    5488          strb    r0, [r1, r2]
8001a7c:    3201          adds    r2, #1
8001a7e:    42a2          cmp    r2, r4
8001a80:    d1f7          bne.n    8001a72


Мне непонятна строчка
Код
ldr.w    sl, [pc, #524]

Что она делает ? Ведь в цикле регистр sl вообще не используется, зачем в него что-то загружается ? И при чем всегда одно и тоже.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 30 2014, 18:19
Сообщение #5


Гуру
******

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



регистр SL - это стэк лимит, а вот зачем в него что-то в цикле пихать постоянно... хрен знает...

может тут SL просто 10 регистр и все? как временный используется...
Go to the top of the page
 
+Quote Post
kan35
сообщение May 31 2014, 00:34
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Между памятью и ядром есть прослойка в виде например ART акселератора. Если память работает на частоте 32МГц, то как инструкции могут поступать с частотой 180МГц?.. - вот потому и за 1 обращение вычитывается от 4 до 8 инструкций.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 31 2014, 01:07
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(dimka76 @ May 31 2014, 00:33) *
Код
8001a6e:    f242 7410     movw    r4, #10000    
8001a72:    5cb8          ldrb    r0, [r7, r2]
8001a74:    6819          ldr    r1, [r3, #0]
8001a76:    f8df a20c     ldr.w    sl, [pc, #524]
8001a7a:    5488          strb    r0, [r1, r2]
8001a7c:    3201          adds    r2, #1
8001a7e:    42a2          cmp    r2, r4
8001a80:    d1f7          bne.n    8001a72

Строчка
Код
    ldr.w    sl, [pc, #524]

явно лишняя, как и строчка
Код
          ldr    r1, [r3, #0]

в цикле. У вас указатель appdata не volatile случайно?



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 1 2014, 04:39
Сообщение #8


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(AHTOXA @ May 31 2014, 09:17) *
У вас указатель appdata не volatile случайно?


Нет, не волатиле.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Haamu
сообщение Jun 20 2014, 05:45
Сообщение #9


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

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Чтобы не плодить новых тем, продолжу эту.
Во flash-памяти контроллера STM32F407 есть такая область под названием "OTP (one-time programmable) area", состоящая из 15 блоков по 32 байта памяти и 16 байт блока защиты. У кого есть опыт работы с этой областью памяти, подскажите пожалуйста, в какой последовательности действовать, чтобы записать туда что-либо?

Сообщение отредактировал Haamu - Jun 20 2014, 05:47
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2014, 07:35
Сообщение #10


Гуру
******

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



Цитата(Haamu @ Jun 20 2014, 08:45) *
подскажите пожалуйста, в какой последовательности действовать, чтобы записать туда что-либо?
www.st.com->Products->Microcontrollers->STM32 ARM Cortex MCU->STM32F4 series->Programming manuals->PM0081 STM32F40xxx and STM32F41xxx Flash programming manual->1.7 One-time programmable bytes


--------------------
На любой вопрос даю любой ответ
"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
Haamu
сообщение Jun 20 2014, 11:17
Сообщение #11


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

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Читал. Правда не в Programming manual, а в Reference manual, одно и то же слово в слово. Все-равно не работает.
Написано "Each OTP data block can be programmed until the value 0x00 is programmed in the corresponding OTP lock byte."
Так и делаю, пишу один байт (либо слово (32 бит), либо 4 слова сразу) нулей по адресу 0x1FFF7A00. После чего пробую записать 32-байтное слово по адресу 0x1FFF7820. Смотрю состояние памяти - остается без изменений (все единицы). Что я делаю не так? Может перед этим еще где-то надо какую-то блокировку снять?
Вот кусок кода:
Код
uint32_t* pLockBlock = (uint8_t)0x1FFF7A00;
*pLockBlock = 0;
uint32_t* pData = (uint32_t)0x1FFF7800;
*pData = 0xAA55AA55;

Может я с указателями что-то напутал?

Сообщение отредактировал Haamu - Jun 20 2014, 11:19
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 20 2014, 11:42
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Haamu @ Jun 20 2014, 15:17) *
Так и делаю, пишу один байт (либо слово (32 бит), либо 4 слова сразу) нулей по адресу 0x1FFF7A00.

Код
uint32_t* pLockBlock = (uint8_t)0x1FFF7A00;
*pLockBlock = 0;

Что-то странно вы пишите - запись 0 по адресу 0.
Может так:
Код
uint32_t* pLockBlock = (uint32_t *)0x1FFF7A00;
*pLockBlock = 0;


Цитата(Haamu @ Jun 20 2014, 15:17) *
После чего пробую записать 32-байтное слово по адресу 0x1FFF7820. Смотрю состояние памяти - остается без изменений (все единицы).

Код
uint32_t* pData = (uint32_t)0x1FFF7800;
*pData = 0xAA55AA55;

Код
uint32_t* pData = (uint32_t *)0x1FFF7800;
*pData = 0xAA55AA55;
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2014, 12:20
Сообщение #13


Гуру
******

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



Цитата(Haamu @ Jun 20 2014, 14:17) *
пишу один байт (либо слово (32 бит), либо 4 слова сразу) нулей по адресу 0x1FFF7A00. После чего пробую записать 32-байтное слово по адресу 0x1FFF7820.
То есть делаете с точность до наоборот от того, что написано в документации. Там написано: после того, как записали 0 в 0x1FFF7A00 - сушите весла, больше ничего программироваться не будет.
Цитата
Each OTP data block can be programmed until the value 0x00 is programmed in the corresponding OTP lock byte.


Ну и с учетом этого - даже хорошо, что вы писали неправильно (см. сообщение Артема). Это раз. И второе - я так понял, что писать эти байты надо так же, как и остальную флеш, то есть через регистры FLASH_KEY, FLASH_CR, FLASH_SR.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Jul 1 2014, 10:00
Сообщение #14


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

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



Цитата(scifi @ May 30 2014, 12:37) *
Кстати, в семействах STM32F2 и STM32F4 флэш устроена иначе, и записывать можно даже 1 байт за раз, что открывает новые возможности для эмуляции EEPROM.

Вот задумался сделать обновление программы по-простому. Приму по USART во внешнюю RAM весь file.bin, а потом попробую записать. Смогу ли? Если можно записывать (и стирать, значит?) по байтам? Когда подберется к месту, где находится сама запись во флэш, команды-то в буфере будут.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 1 2014, 10:10
Сообщение #15


Гуру
******

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



Цитата(ViKo @ Jul 1 2014, 14:00) *
Если можно записывать (и стирать, значит?) по байтам?

Нет, конечно. Стирается целый сектор. Иначе это была бы не флеш, а EEPROM.
Там и другая проблема: если прервать прошивку, то устройство превращается в кирпич. Поэтому нужен загрузчик.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 1 2014, 10:18
Сообщение #16


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

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



Как бы тогда перекинуть функцию записи в ОЗУ, и выполнить?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 1 2014, 10:22
Сообщение #17


Гуру
******

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



Цитата(ViKo @ Jul 1 2014, 14:18) *
Как бы тогда перекинуть функцию записи в ОЗУ, и выполнить?

Вот так, к примеру:
Код
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))(&fw_start);

Самый переносимый способ. Функцию можно сделать очень компактной, так что особого напряга быть не должно.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 1 2014, 11:06
Сообщение #18


Знающий
****

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



Цитата(ViKo @ Jul 1 2014, 06:18) *
Как бы тогда перекинуть функцию записи в ОЗУ, и выполнить?

Или пользоватся встроенным бутлоадером, или сделать свой.
Основную программу разместить по другому аддрессу.
Тогда и внешняя РАМ не надо


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 1 2014, 11:07
Сообщение #19


Гуру
******

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



Цитата(scifi @ Jul 1 2014, 13:22) *
Самый переносимый способ. Функцию можно сделать очень компактной, так что особого напряга быть не должно.

Но не самый "прямой".
Код
__attribute__(("section"(".ramfunc")))
void somefunc()
{
     ......

}

*.ld:
......
    .data :
    {
        . = ALIGN(4);
        _sdata = .;                /* start of .data label */
        *(.ramfunc)
        *(.ramfunc.*)
        *(.data)
        *(.data.*)
        . = ALIGN(4);
        _edata = .;                /* end of .data label */
    } > RAM AT > TEXT
    _sidata = LOADADDR(.data);    /* start of initialized data label */

И все. Тело функции будет скопировано перед запуском main() заодно с инициализированными данными (как и ваше, кстати), но обращаться к ней можно напрямую - линкер при обращении к этой функции будет подставлять правильный адрес в ОЗУ, и не нужно писать эту функцию в машинных кодах. Для других компиляторов можно сделать аналогично.
Но сколько работаю с разными Cortex, пока что ни разу функция в ОЗУ не потребовалась.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Jul 1 2014, 11:13
Сообщение #20


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

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



Да, можно разместить "прошивальщик" в конце flash, например. И не трогать этот сектор никогда.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 1 2014, 11:15
Сообщение #21


Знающий
****

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



Цитата(ViKo @ Jul 1 2014, 07:13) *
Да, можно разместить "прошивальщик" в конце flash, например. И не трогать этот сектор никогда.

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


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 1 2014, 11:18
Сообщение #22


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

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



Цитата(A. Fig Lee @ Jul 1 2014, 14:15) *
Нет, прошивальщик должен всегда стартовать по нулевому аддрессу, с рестарта. Иначе смысл теряется.
А вот программа может быть где угодно

Так стартовать можно, куда задашь. По нулевому адресу расположена таблица startup.
Хорошо, стартанул я в загрузчик. Настроил все нужные режимы, чтобы принять новую прошивку. Жду... а ее нет. Подождал, свалил в основную программу. Так?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 1 2014, 11:25
Сообщение #23


Гуру
******

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



Цитата(ViKo @ Jul 1 2014, 14:18) *
По нулевому адресу расположена таблица startup.
Таблица векторов прошивальщика. Приложение со своей собственной таблицей может располагаться где угодно. При старте запускается прошивальщик, он проверяет целостность приложения, переключает VTOR на вектора приложения (для Cortex-M0 копирует вектора приложения в ОЗУ и делает ремап), грузит указатель стека из векторов приложения и передает управление на вектор Reset приложения. Приложение может отсутствовать вообще (или быть испорченным, недозаписанным), в этом случае прошивальщик весело мигая светодиодом ожидает новую прошивку для приложения, записывает ее и делает рестарт. После рестарта прошивальщик проверяет целостность... (далее читать с начала).


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Jul 1 2014, 11:34
Сообщение #24


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

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



Цитата(Сергей Борщ @ Jul 1 2014, 14:25) *
При старте запускается прошивальщик, он проверяет целостность приложения, переключает VTOR на вектора приложения (для Cortex-M0 копирует вектора приложения в ОЗУ и делает ремап), грузит указатель стека из векторов приложения и передает управление на вектор Reset приложения.

А если приложение целое, но хочу зашить новую прошивку? Чем подтолкнуть?
А целостность как определить - CRC посчитать? А размеры кода откуда узнать, хранить во flash, рядом с CRC?

В конце flash сектора большие, по 128 KB (речь идет про STM32F20x). Значит, загрузчик надо расположить в начальных секторах, или в OTP (страшно!).
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 1 2014, 11:48
Сообщение #25


Гуру
******

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



Цитата(ViKo @ Jul 1 2014, 14:34) *
А если приложение целое, но хочу зашить новую прошивку? Чем подтолкнуть?
Я делаю программный сброс из приложения. А загрузчик после обновления делает сброс по собаке. При старте загрузчика проверяю источник сброса и если он программный - ухожу на обновление, если нет - проверяю целостность и запускаю приложение.
Цитата(ViKo @ Jul 1 2014, 14:34) *
А целостность как определить - CRC посчитать?
Да, тем более что у STM32 есть и аппаратный расчет CRC и DMA.
Цитата(ViKo @ Jul 1 2014, 14:34) *
А размеры кода откуда узнать, хранить во flash, рядом с CRC?
Я размер храню сразу после области векторов приложения. У меня его туда линкет прописывает:
Код
    .text :
    {
        _image_start = .;
        KEEP(*(.isr_vector))

        LONG((_image_end - _image_start) / 4);    /* application size, in 4-byte words */
      
    ....................
    } > TEXT

    .data :
    {
        . = ALIGN(4);
        _sdata = .;                /* start of .data label */
        *(.ramfunc)
        *(.ramfunc.*)
        *(.data)
        *(.data.*)
        . = ALIGN(4);
        _edata = .;                /* end of .data label */
    } > RAM AT > TEXT
    _sidata = LOADADDR(.data);    /* start of initialized data label */

    .crc :
    {
        . = . + 4;        /* reserve space for CRC */
        _image_end = .;
    } > TEXT



Цитата(ViKo @ Jul 1 2014, 14:34) *
Значит, загрузчик надо расположить в начальных секторах, или в OTP (страшно!).
Разумеется в начальных секторах. Чтобы всегда, после заливки чего угодно он всегда стартовал первым и имел возможность залить другое приложения. Я предусматриваю одну из свободных ног для принудительного запуска загрузчика - если залито приложение, которое хотя и целое, но тем не менее нерабочее, то сняв питание, закоротив эту ногу и подав питание снова, я из кирпича получаю готовое к обновлению устройство.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Jul 1 2014, 12:15
Сообщение #26


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

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



В секторе 0 расположить загрузчик, основную программу начать с сектора 1.
А таблицей векторов нельзя ли одной обойтись? Запретить все прерывания при загрузке, и шабаш?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 1 2014, 12:22
Сообщение #27


Гуру
******

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



Цитата(ViKo @ Jul 1 2014, 15:15) *
В секторе 0 расположить загрузчик, основную программу начать с сектора 1.
Именно.
Цитата(ViKo @ Jul 1 2014, 15:15) *
А таблицей векторов нельзя ли одной обойтись? Запретить все прерывания при загрузке, и шабаш?
Не вижу смысла. Вектора приложения все равно каким-то образом должны попасть на свое место - или через VTOR или через ремап. При этом содержимое векторов загрузчика никакой роли уже не имеет. Никаких плюсов от неиспользования прерываний в загрузчике нет.


--------------------
На любой вопрос даю любой ответ
"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
doom13
сообщение Jul 1 2014, 13:16
Сообщение #28


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

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Сергей Борщ @ Jul 1 2014, 14:48) *
Я предусматриваю одну из свободных ног для принудительного запуска загрузчика - если залито приложение, которое хотя и целое, но тем не менее нерабочее, то сняв питание, закоротив эту ногу и подав питание снова, я из кирпича получаю готовое к обновлению устройство.

И вчём смысл такого решения, если всё равно необходимо будет разобрать всё устройство (что порой бывает не просто), чтобы добраться до платы с процессором. Там уже что ножку коротить, что программатор подключить, особой разницы нету.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 1 2014, 13:32
Сообщение #29


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(doom13 @ Jul 1 2014, 17:16) *
И вчём смысл такого решения, если всё равно необходимо будет разобрать всё устройство (что порой бывает не просто), чтобы добраться до платы с процессором. Там уже что ножку коротить, что программатор подключить, особой разницы нету.
Это нормальное решение. Сам так всегда делаю.
Часто у устройств есть клавиатура или кнопочки, поэтому и без разбора прибора всё прекрасно получается.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
doom13
сообщение Jul 1 2014, 13:41
Сообщение #30


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

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(demiurg_spb @ Jul 1 2014, 16:32) *
Это нормальное решение. Сам так всегда делаю.
Часто у устройств есть клавиатура или кнопочки, поэтому и без разбора прибора всё прекрасно получается.

Т.е. данная кнопка выносится на корпус и доступна любому пользователю? На мой взгляд, не есть хорошее решение. Если бы какой-то Master мог сделать это по внешней технологической команде, тогда ещё приемлемо.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 1 2014, 13:55
Сообщение #31


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

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



Я последовательно соединял две независимых кнопки (у каждой две группы контактов). В обычном режиме каждая работает сама по себе, а когда нажимаю обе - особый случай.
Теперь аналогичное делаю программным способом, с некоторыми дополнительными условиями.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 1 2014, 13:57
Сообщение #32


Гуру
******

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



Цитата(doom13 @ Jul 1 2014, 17:41) *
Т.е. данная кнопка выносится на корпус и доступна любому пользователю? На мой взгляд, не есть хорошее решение. Если бы какой-то Master мог сделать это по внешней технологической команде, тогда ещё приемлемо.

У меня обычно есть несколько кнопок, и я делаю вход в загрузчик, если при включении питания нажата определённая комбинация. Обычный обыватель не догадается, и в случае неисправности комбинацию можно сообщить пользователю. Опять же залить что попало он туда не сможет, потому что есть проверка целостности прошивки.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 1 2014, 15:11
Сообщение #33


Гуру
******

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



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

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

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

Так же надо не забывать что иногда ваши устройства собирают партнеры которые могут и обновлять прошивки во время сборки, что им ЖТАГ поставлять?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 1 2014, 15:29
Сообщение #34


Гуру
******

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



Цитата(Golikov A. @ Jul 1 2014, 18:11) *
Но аварийная кнопка нужна. Если случайно зальют левак какой-то с верным ЦРЦ и верным кодом безопасности или в котором команда перехода в бутлоадер сломана или езернет отвалится, или случайно у битого кода совпадет ЦРЦ, мало ли что.....
Именно. Или какой-то непредусмотренной комбинацией штатных настроек устройство приводится в нерабочее состояние (ну бывает, любая программа содержит минимум одну ошибку), или клиенту случайно отправили промежуточную, совсем нерабочую версию - вот в таком крайнем случае можно попросить клиента вскрыть устройство, замкнуть заветную точку и залить исправление. Это быстрее и дешевле, чем пересылать устройство на ремонт через половину земного шарика. В штатном режиме устройство обновляется командой по интерфейсу без вмешательства человека.


--------------------
На любой вопрос даю любой ответ
"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
demiurg_spb
сообщение Jul 2 2014, 08:42
Сообщение #35


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(doom13 @ Jul 1 2014, 17:41) *
Т.е. данная кнопка выносится на корпус и доступна любому пользователю?
Она не выносится, она уже есть и является частью клавиатуры прибора. И используется обычно по своему назначению, а вызов загрузчика это её вторая скрытая функция, активируемая лишь в момент подачи питания на несколько миллисекунд.
Убеждать вас в её необходимости я не буду. Сами всё поймёте рано или поздно.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
doom13
сообщение Jul 2 2014, 08:46
Сообщение #36


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

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(demiurg_spb @ Jul 2 2014, 11:42) *
Она не выносится, она уже есть и является частью клавиатуры прибора. И используется обычно по своему назначению, а вызов загрузчика это её вторая скрытая функция, активируемая лишь в момент подачи питания на несколько миллисекунд.
Убеждать вас в её необходимости я не буду. Сами всё поймёте рано или поздно.

Может быть и так, но тогда есть вероятность получить такое:
Цитата(Golikov A. @ Jul 1 2014, 18:11) *
А у меня есть видеорегистратор, который виснет если при включении держать кнопку, и только ресетом через дырочку отвисает. Подозреваю как раз в загрузчик переходит. А вот что выйти кнопкой включения нельзя - руки бы поломал бы.... Да еще кнопки так стоят, что включая легко задеть ту самую заветную%)...

Ну и как же быть, если нет никаких кнопок. В нашей системе и без кнопок всё нормально работает, переход в загрузчик только по командам CAN, Ethernet. Не считаю наличие данной кнопки необходимостью любой системы и Вас также переубеждать не стану. Думаю, где-то может быть оправдано такое решение где-то нет.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 2 2014, 08:55
Сообщение #37


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

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



А вот можно ли зайти во встроенный загрузчик в STM32? Адрес известен, перенести таблицу векторов... Или там работает абсолютная адресация, и нужно отобразить System память на нулевые адреса (что делается ножками boot)?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 2 2014, 08:59
Сообщение #38


Гуру
******

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



У ST есть несколько подробных аппнотов по загрузчику. Думаю, этот вопрос там освещен.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Jul 2 2014, 09:05
Сообщение #39


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

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



Цитата(Сергей Борщ @ Jul 2 2014, 11:59) *
У ST есть несколько подробных аппнотов по загрузчику. Думаю, этот вопрос там освещен.

Листал. Там расписано, как работать со встроенным загрузчиком. Но чтобы из рабочей программы скакнуть, такого не помню. Впрочем, читал не внимательно.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 2 2014, 09:11
Сообщение #40


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(doom13 @ Jul 2 2014, 12:46) *
Может быть и так, но тогда есть вероятность получить такое:
Чтобы такого не было я использую таймаут и выхожу из загрузчика при его бездействии.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 2 2014, 09:42
Сообщение #41


Гуру
******

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



Цитата(ViKo @ Jul 2 2014, 13:05) *
Листал. Там расписано, как работать со встроенным загрузчиком. Но чтобы из рабочей программы скакнуть, такого не помню. Впрочем, читал не внимательно.

Эта фича не предусмотрена, насколько я понял. Но никто не мешает МК самому себе дёргать ногу BOOT0 и делать сброс (+конденсатор, чтобы нужный уровень на BOOT0 продержался до выхода из сброса).
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Jul 2 2014, 15:02
Сообщение #42


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(demiurg_spb @ Jul 2 2014, 11:42) *
И используется обычно по своему назначению, а вызов загрузчика это её вторая скрытая функция, активируемая лишь в момент подачи питания на несколько миллисекунд.

Правильно. Да, ограничения накладывает, но если продумать комбинацию (CTRL+ALT+DEL например :-)) В последних SAM3 именно так и сделана фунция ERASE. В момент подачи питания анализируется уровень PIO_ERASE, а потом программа в праве переключить на PIO или оставить как есть.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 4 2014, 17:37
Сообщение #43


Гуру
******

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



Писал ответ в соседнюю тему и пришла в голову такая мысль: запустить загрузчик на Cortex-M3/M4 очень просто. Мы же знаем, где он находится. Значит знаем, где начинаются его вектора. Нам надо запретить прерывания, установить VTOR на вектора загрузчика, загрузить в MSP число из первого слова векторов, переключить стек на MSP и передать управление на адрес из второго слова векторов. То есть произвести те же действия, которые мы делаем при запуске приложения из самописного загрузчика.

P.S. Хм, ViKo как раз это и предлагал. Надо читать сообщения внимательнее.


--------------------
На любой вопрос даю любой ответ
"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
A. Fig Lee
сообщение Jul 4 2014, 17:57
Сообщение #44


Знающий
****

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



Цитата(Сергей Борщ @ Jul 4 2014, 13:37) *
Писал ответ в соседнюю тему и пришла в голову такая мысль: запустить загрузчик на Cortex-M3/M4 очень просто. Мы же знаем, где он находится. Значит знаем, где начинаются его вектора. Нам надо запретить прерывания, установить VTOR на вектора загрузчика, загрузить в MSP число из первого слова векторов, переключить стек на MSP и передать управление на адрес из второго слова векторов. То есть произвести те же действия, которые мы делаем при запуске приложения из самописного загрузчика.

P.S. Хм, ViKo как раз это и предлагал. Надо читать сообщения внимательнее.

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


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 4 2014, 18:20
Сообщение #45


Гуру
******

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



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

Чего я не понимаю? Или это способ ухода от вочдога? Так регистры то не сбросятся...
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 4 2014, 18:39
Сообщение #46


Гуру
******

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



Цитата(Сергей Борщ @ Jul 4 2014, 21:37) *
Писал ответ в соседнюю тему и пришла в голову такая мысль: запустить загрузчик на Cortex-M3/M4 очень просто.

Я поспешил со своим ответом. У них так и написано:
Цитата
In addition to patterns described below, user can execute bootloader by performing a jump
to system memory from user code. Befor jumping to Bootloader user must :
• Disable all peripheral clocks
• Disable used PLL
• Disable interrupts
• Clear pending interrupts
System memory boot mode can be exited by getting out from bootloader activation
condition and generating hardware reset or using Go command to execute user code.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 4 2014, 18:42
Сообщение #47


Гуру
******

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



Цитата(Golikov A. @ Jul 4 2014, 21:20) *
А если с ресетом, то вроде и так запустится штатный загрузчик?
Возможно хочется обновляться штатным, но по возможности не добираясь до ноги BOOT, по команде приложению?


--------------------
На любой вопрос даю любой ответ
"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
A. Fig Lee
сообщение Jul 4 2014, 19:14
Сообщение #48


Знающий
****

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



Цитата(Сергей Борщ @ Jul 4 2014, 14:42) *
Возможно хочется обновляться штатным, но по возможности не добираясь до ноги BOOT, по команде приложению?

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


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 5 2014, 06:40
Сообщение #49


Гуру
******

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



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

и мы не трогая ножку бут имеем возможность обновить прошивку через UART?

Ну да, наверное это интересная мысль. Главное не затереть начальный разветвитель, а то придем к кирпичуsm.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 7 2014, 10:10
Сообщение #50


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

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



Так же можно потерять и самопальный загрузчик. Вероятность, конечно, меньше, чем основную программу (судя по размерам), но... терять, так терять. И тогда остается только встроенный системный загрузчик, или специально предназначенные для программирования средства.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 7 2014, 13:11
Сообщение #51


Гуру
******

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



ну как можно потерять самопальный загрузчик? Если загрузка идет только через него, он просто следит чтобы никто не лез в область где он лежит и все. Его невозможно убить.
А вот если в ходе ветвления можно войти и в штатный процовый, то тогда он потенциально под угрозой.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 7 2014, 13:58
Сообщение #52


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

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



Цитата(Golikov A. @ Jul 7 2014, 16:11) *
ну как можно потерять самопальный загрузчик?

Так же, как и основную программу. С помощью электромагнитного импульса, например, как в "Матрице".
То есть, если принимать меры к тому, чтобы входить в самодельный загрузчик сразу после сброса, из опасения, что основная программа может глючить, и из нее уже не войти, то тогда надо думать и о том, что и сам этот загрузчик может заглючить. А если не думать, то не думать. rolleyes.gif Поэтому я и хочу по простому перескочить во встроенный загрузчик. Для начала. А там видно будет.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 7 2014, 15:01
Сообщение #53


Знающий
****

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



Цитата(ViKo @ Jul 7 2014, 09:58) *
Так же, как и основную программу. С помощью электромагнитного импульса, например, как в "Матрице".
То есть, если принимать меры к тому, чтобы входить в самодельный загрузчик сразу после сброса, из опасения, что основная программа может глючить, и из нее уже не войти, то тогда надо думать и о том, что и сам этот загрузчик может заглючить. А если не думать, то не думать. rolleyes.gif Поэтому я и хочу по простому перескочить во встроенный загрузчик. Для начала. А там видно будет.

Встроенный загрузчик тоже может глючить. Изза электромагнитного импульса, например.
Предлагаю делать резервирование - как для космоса делали: 3 одинаковых канала,
решение принимается голосованием, если 2 сказали 1, значит 1.
Так меньше вероятность глюков.
3 одинаковых СТМ, на всякий случай - а вдруг заглючит?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 7 2014, 20:00
Сообщение #54


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

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



И 3 ФигЛи, несомненно, лучше одного. Не зря соображают на троих.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 7 2014, 20:18
Сообщение #55


Гуру
******

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



Вижу о космосе вы знаете по наслышкеsm.gif
2 из 3 - это для ближнего космоса, до луны край! Нормальный режим 3 из 5!

Глюк нормальной программы я больше отношу к пользователю. Найдет какую-то фигню, от другого продукта, и зальет как обновление. И здрасьте вам Кирпичь Иваныч! На эти случаи всегда даю пользователю еще попыткуsm.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 7 2014, 20:34
Сообщение #56


Гуру
******

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



Цитата(Golikov A. @ Jul 8 2014, 00:18) *
На эти случаи всегда даю пользователю еще попыткуsm.gif

Дык для этого нужно купюроприёмник добавлять. Одна надежда на Национальную Платёжную Систему: должно попроще стать. Хотя, зная наших чиновников, не очень надеюсь :-)
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 8 2014, 01:50
Сообщение #57


Знающий
****

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



Цитата(Golikov A. @ Jul 7 2014, 16:18) *
Вижу о космосе вы знаете по наслышкеsm.gif
2 из 3 - это для ближнего космоса, до луны край! Нормальный режим 3 из 5!

Глюк нормальной программы я больше отношу к пользователю. Найдет какую-то фигню, от другого продукта, и зальет как обновление. И здрасьте вам Кирпичь Иваныч! На эти случаи всегда даю пользователю еще попыткуsm.gif

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


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 8 2014, 05:47
Сообщение #58


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
mantech
сообщение Jul 9 2014, 16:18
Сообщение #59


Гуру
******

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



Цитата(Сергей Борщ @ Jul 8 2014, 08:47) *
А я для каждого изделия использую уникальные ключи шифрования. Загрузчик зальет в изделие только его родную прошивку. Но все равно остается шанс, что родная прошивка сделает из изделия кирпич из-за того, что я не предусмотрел какой-то нюанс.


Че-то я не понял, если бут находится в своей выделенной области флеша, пользовательская прога во флеш не пишет что-попало, то какого рожна что-то должно превратить камень в кирпич?? Ну зашил он туда хрень, потом рестартанет проц в режиме бута и прошьет что надо. Уже дофига такого было, пока прошивки шифровать не начал, теперь хрень не шьют biggrin.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 9 2014, 19:00
Сообщение #60


Гуру
******

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



Для этого нужно оставить механизм старта бута. Если прошили хрень с правильными кодами, которая запускается и виснит. А кнопочки перейти в бут нету, вот вам и кирпич...
Go to the top of the page
 
+Quote Post
skripach
сообщение Jul 9 2014, 20:01
Сообщение #61


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата(Golikov A. @ Jul 9 2014, 22:00) *
Для этого нужно оставить механизм старта бута. Если прошили хрень с правильными кодами, которая запускается и виснит. А кнопочки перейти в бут нету, вот вам и кирпич...

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


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 9 2014, 20:39
Сообщение #62


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
A. Fig Lee
сообщение Jul 9 2014, 20:57
Сообщение #63


Знающий
****

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



Цитата(Сергей Борщ @ Jul 9 2014, 16:39) *
Тогда поделитесь сокровенным - как ваш бут отличает прошивку, которую он должен запустить от находящейся в тех же адресах хрени с правильной контрольной суммой.

А зачем ее отличать?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 9 2014, 21:46
Сообщение #64


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(A. Fig Lee @ Jul 10 2014, 00:57) *
А зачем ее отличать?
Странный вопрос...
В том то и дело что способа отличить нет. И без возможности принудительно войти в загрузчик - кирпич.
У меня складывается впечатление что мы уже по десятому разу вокруг да около ходим.
Вы с какой целью последний вопрос задавали? Вы же заранее знаете ответ.
Чтобы потроллить? Ну тогда я думаю что немного не то место выбрали. Извините, но накипело.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 9 2014, 22:54
Сообщение #65


Знающий
****

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



Цитата(demiurg_spb @ Jul 9 2014, 17:46) *
Странный вопрос...
В том то и дело что способа отличить нет. И без возможности принудительно войти в загрузчик - кирпич.
У меня складывается впечатление что мы уже по десятому разу вокруг да около ходим.
Вы с какой целью последний вопрос задавали? Вы же заранее знаете ответ.
Чтобы потроллить? Ну тогда я думаю что немного не то место выбрали. Извините, но накипело.

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


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 9 2014, 23:05
Сообщение #66


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(A. Fig Lee @ Jul 10 2014, 02:54) *
Вы несколько ответов предыдущих прочитайте тогда у вас и вопросов про кирпич не будет.
У меня вопросов по загрузчикам нет уже лет 10. Вы не сомневайтесь - читать я умею. Вы лучше процитируйте меня, где я задаю вам вопрос про кирпич или про что-либо иное, имеющее отношение к технической части этого топика. И давайте пожалуйста чётко по пунктам без домысливания.
Цитата
Какой ответ я должен знать?
Что загрузчик не в состоянии отвечать за верность "бизнес-логики" приложения и точка.
Поэтому все дальнейшие вопросы на эту тему абсурдны и не имею никакого смысла.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 10 2014, 01:27
Сообщение #67


Знающий
****

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



Цитата(demiurg_spb @ Jul 9 2014, 19:05) *
У меня вопросов по загрузчикам нет уже лет 10. Вы не сомневайтесь - читать я умею. Вы лучше процитируйте меня, где я задаю вам вопрос про кирпич или про что-либо иное, имеющее отношение к технической части этого топика. И давайте пожалуйста чётко по пунктам без домысливания.
Что загрузчик не в состоянии отвечать за верность "бизнес-логики" приложения и точка.
Поэтому все дальнейшие вопросы на эту тему абсурдны и не имею никакого смысла.


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

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

У меня уши на ширине плеч


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 10 2014, 06:04
Сообщение #68


Гуру
******

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



Цитата(A. Fig Lee @ Jul 10 2014, 04:27) *
Опишите мне, как вы кирпич получаете изза неправильной прошивки в случае нормального бутлоадера:

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

Я писал - на такой крайний случай у меня внутри предусмотрена магическая точка на плате. В таком крайнем случае можно разобрать устройство, замкнуть эту точку, подать питание и загрузчик не будет запускать приложение, давая возможность залить исправление. Далее сначала задается куча вопросов "а нахрена такая точка?", "это что же, надо разбирать?", потом приходит mantech и говорит, что все это фигня и загрузчик должен быть правильным. Так расскажите нам, что значит правильный загрузчик? Только прочитайте ветку сначала - возможно все, что вы хотите написать, здесь уже неоднократно описывалось.


--------------------
На любой вопрос даю любой ответ
"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
Axel
сообщение Jul 10 2014, 06:21
Сообщение #69


Местный
***

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



Цитата(A. Fig Lee @ Jul 10 2014, 04:27) *
Опишите мне, как вы кирпич получаете изза неправильной прошивки в случае нормального бутлоадера

Естественный вопрос... если бутлоадер является самой сложной частью системы.
Go to the top of the page
 
+Quote Post
skripach
сообщение Jul 10 2014, 06:54
Сообщение #70


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата(Сергей Борщ @ Jul 10 2014, 09:04) *
И? Залетело сначала в бут. Проверило приложение - контрольная сумма совпала. Ушло в приложение. Вместо приложения оказалась хрень (как бы нормальная программа, но именно с текущей сохраненной комбинацией настроек она уходит в глухой цикл и ни на что не реагирует - "кирпич"). Каким образом от этого спасет нормальный бутлодер?

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


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 10 2014, 07:44
Сообщение #71


Гуру
******

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



Уже на несколько страниц размазалось обсуждение одних и тех же тривиальных вопросов, причём обсуждение идёт по кругу. ИМХО, закрывать надо эту ветку.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 10 2014, 07:58
Сообщение #72


Гуру
******

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



Цитата(skripach @ Jul 10 2014, 09:54) *
Удерживаем какую-то кнопку -> дергаем питание -> девайс висит в бутмоде
"На колу мочало - начинай сначала". Вы бы хоть пару предыдущих страниц прочитали, прежде чем ответ писать. И про кнопку было, и про недостатки такого варианта.

P.S. В моих устройствах кнопок вообще нет. Ну вот так получается.


--------------------
На любой вопрос даю любой ответ
"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
demiurg_spb
сообщение Jul 10 2014, 08:28
Сообщение #73


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(scifi @ Jul 10 2014, 11:44) *
Уже на несколько страниц размазалось обсуждение одних и тех же тривиальных вопросов, причём обсуждение идёт по кругу. ИМХО, закрывать надо эту ветку.
Согласен на все 100%. Начинает напоминать анекдот про "-А вас? -Авас...".

Цитата(A. Fig Lee @ Jul 10 2014, 05:27) *
У меня уши на ширине плеч
Ну теперь-то понятно стало?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 10 2014, 08:41
Сообщение #74


Гуру
******

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



Все таки хотелось бы еще раз поговорить про кнопку, какая она.... sm.gif)))
Да надо закрывать тему, а то так и будем по кругу ходить...
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 10 2014, 11:08
Сообщение #75


Знающий
****

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



Цитата(Сергей Борщ @ Jul 10 2014, 02:04) *
И? Залетело сначала в бут. Проверило приложение - контрольная сумма совпала. Ушло в приложение. Вместо приложения оказалась хрень (как бы нормальная программа, но именно с текущей сохраненной комбинацией настроек она уходит в глухой цикл и ни на что не реагирует - "кирпич"). Каким образом от этого спасет нормальный бутлодер? И что в вашем понятии "нормальный"?

Я писал - на такой крайний случай у меня внутри предусмотрена магическая точка на плате. В таком крайнем случае можно разобрать устройство, замкнуть эту точку, подать питание и загрузчик не будет запускать приложение, давая возможность залить исправление. Далее сначала задается куча вопросов "а нахрена такая точка?", "это что же, надо разбирать?", потом приходит mantech и говорит, что все это фигня и загрузчик должен быть правильным. Так расскажите нам, что значит правильный загрузчик? Только прочитайте ветку сначала - возможно все, что вы хотите написать, здесь уже неоднократно описывалось.


Что значит "уходит в цикл и кирпич"? ПО РЕСЕТУ МЫ ВСЕГДА ПОПАДАЕМ в БУТЛОАДЕР!
Какой кирпич? Сделал ресет, перезалил.
ЗАЧЕМ ПРОВЕРЯТЬ КОНТРОЛЬНУЮ СУММУ ЕСЛИ ВСЕГДА МОЖНО ПЕРЕЗАЛИТЬ?

Это мне непонятно.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 10 2014, 11:36
Сообщение #76


Гуру
******

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



Цитата(A. Fig Lee @ Jul 10 2014, 14:08) *
Что значит "уходит в цикл и кирпич"? ПО РЕСЕТУ МЫ ВСЕГДА ПОПАДАЕМ в БУТЛОАДЕР!
И что? А без дополнительных телодвижений мы из бутлодера уходим в прошивку. А про телодвижения было расписано по четыре раза на предыдущих страницах - какие и зачем. Вот возьмите и прочитайте. И не пытайтесь впарить мне как открытие решение, которое я давно использую и которое описал на предыдущих страницах (уже, похоже, не один раз описал).
Цитата(A. Fig Lee @ Jul 10 2014, 14:08) *
ЗАЧЕМ ПРОВЕРЯТЬ КОНТРОЛЬНУЮ СУММУ ЕСЛИ ВСЕГДА МОЖНО ПЕРЕЗАЛИТЬ?
Вы перезаливаете после каждого включения? Или у вас загрузчик все же при нормальном включении как-то определяет - запускать приложение или его там нет?


--------------------
На любой вопрос даю любой ответ
"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.
сообщение Jul 10 2014, 11:47
Сообщение #77


Гуру
******

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



А вот тут вдруг у меня возникло такое подозрение...

Может человек говорит про микробут или что-то типа.
То есть загрузчик который берет прошивку рабочую с СД карты или что-то типа того? То есть у него нет жестко прописываемой основной программы...
Go to the top of the page
 
+Quote Post
Axel
сообщение Jul 10 2014, 12:02
Сообщение #78


Местный
***

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



Цитата(Golikov A. @ Jul 10 2014, 14:47) *
То есть у него нет жестко прописываемой основной программы...

Вряд ли... В этом случае логично было бы увидеть "всегда нужно перезаливать" вместо "всегда можно".
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 10 2014, 14:00
Сообщение #79


Знающий
****

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



Цитата(Сергей Борщ @ Jul 10 2014, 07:36) *
И что? А без дополнительных телодвижений мы из бутлодера уходим в прошивку. А про телодвижения было расписано по четыре раза на предыдущих страницах - какие и зачем. Вот возьмите и прочитайте. И не пытайтесь впарить мне как открытие решение, которое я давно использую и которое описал на предыдущих страницах (уже, похоже, не один раз описал).
Вы перезаливаете после каждого включения? Или у вас загрузчик все же при нормальном включении как-то определяет - запускать приложение или его там нет?


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

Я проверяю только примитив - если в начале лежит стекпойнтер 0x2000XXX.

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

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


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 10 2014, 18:00
Сообщение #80


Гуру
******

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



Извращенная логика%sm.gif...

Забавно что вы не проверяете целостность прошивки. А если залилось что-то не так? А если флэш поврежден?
Счастливые люди приборы которых не могут ничего испортитьsm.gif))...

Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 10 2014, 18:15
Сообщение #81


Знающий
****

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



Цитата(Golikov A. @ Jul 10 2014, 14:00) *
Извращенная логика%sm.gif...

Забавно что вы не проверяете целостность прошивки. А если залилось что-то не так? А если флэш поврежден?
Счастливые люди приборы которых не могут ничего испортитьsm.gif))...


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

Но в принципе пойнт понятен. Спасибо


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 10 2014, 18:56
Сообщение #82


Гуру
******

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



Цитата
Контрольная сумма не спасает от повреждения.

Смотря повреждения чегоsm.gif..
У меня одно устройство могло поднять тревогу и вызвать бригаду со стоимостью выезда 10-20 тысяч баксов. Если это бы произошло из-за того что прошивка неправильно записана во флэш мне бы сделали повреждение головыsm.gif.
Другое устройство могло запустить систему пожаротушения основанную на шашках которые абсорбируют кислород, если бы оно это сделало в помещении с людьми оно бы их задушило
Третье устройство могло поехать и ударить в дорогущий микроскоп дорогущим объектом.

Во всех случаях я предпочту чтобы устройство не запустилось, чем сделало это...
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jul 11 2014, 06:28
Сообщение #83


Знающий
****

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



Я в своём софте тоже проверяю только, что сектор не пустой перед прыжком, однако подход Golikov A. очень даже разумен для критических применений железа. На самом деле, повреждённый байт может привести к катастрофическим последствиям.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 11 2014, 06:46
Сообщение #84


Гуру
******

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



Ну что ж, идем на очередной круг. Не всегда есть возможность подойти и передернуть питание. Бывает, что обновление хочется сделать удаленно. И если во время такого обновления происходит сбой (связи), то с вашей проверкой на непустой сектор вы запустите нерабочее приложение и придется таки посылать человека жать на кнопку и передергивать питание. В моей и в Golikov A. реализации загрузчик обнаружит испорченное приложение и останется в режиме ожидания загрузки, давая возможность повторить загрузку. И ради чего ваши жертвы? Ради экономии 20 байт и 10 мс на проверку 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
adnega
сообщение Jul 11 2014, 07:39
Сообщение #85


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Я в "крупных" МК использую две области: application и image.
Когда необходимо обновить прошивку, код, работающий в application (по сути сама программа) стирает image, получает и записывает image, проверяет CRC, версию железа и версию прошивки и после этого передает управление загрузчику (через SoftReset). До тех пор, или в случае некорректного/старого image программа работает и практически не чувствует, что идет какое-то обновление.
Загрузчик проверяет корректность и версию как application, так и image. Если все CRC корректны и версия application >= версии image, то управление передается application. Если CRC у application не корректна, а у image корректна, то image расшифровывается и переписывается в application, как и в том случе, если версия image новее, затем перезагрузка. Если все CRC не корректны, то остаемся в загрузчике и мигаем светодиодом "SOS". Некоторые функции как подсчет CRC (в том числе на лету, по ходу выполнения программы), расшифровка и т.п. вынесены в область загрузчика и application их экспортирует по фиксированным адресам из таблицы экспорта (последние 240 байт загрузчика).
Из бонусов image шифрованный, сложно получить кирпич, обновление мгновенное (минимально возможное время, т.к. основная часть тратится на передачу image по GPRS|SD-карты|RS485 и т.п., а application при этом работает). Из минусов: расход памяти практически удвоенный (но image можно держать во внешней медленной/последовательной памяти, т.к. он шифрован и не отличается от того, что передается Заказчику свободно в качестве обновления), загрузчик поддерживает лишь базовые варианты управления без возможности модернизации.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 11 2014, 09:15
Сообщение #86


Гуру
******

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



У меня обновление на лету. Тоже шифрование. Нет необходимости в дополнительной памяти. В случае сбоя обновления меня не напрягает повторить. Обновление через UART. Будет GPRS - буду думать.


--------------------
На любой вопрос даю любой ответ
"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
andrewlekar
сообщение Jul 11 2014, 09:44
Сообщение #87


Знающий
****

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



Цитата
И ради чего ваши жертвы? Ради экономии 20 байт и 10 мс на проверку CRC приложения?

Я просто описал, как оно у меня щас сделано и не призываю делать так всех.
Удалённого обновления на данный момент нет, поэтому и вышеописанные ужасы вряд ли произойдут. Когда удалённое обновление появится, то я буду проверять контрольную сумму каждого пакета и делать верификацию всей прошивки после заливки. И это будет происходить в отдельной области памяти, а не поверх рабочей прошивки.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 11 2014, 11:33
Сообщение #88


Знающий
****

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



Цитата(Сергей Борщ @ Jul 11 2014, 02:46) *
Ну что ж, идем на очередной круг. Не всегда есть возможность подойти и передернуть питание. Бывает, что обновление хочется сделать удаленно. И если во время такого обновления происходит сбой (связи), то с вашей проверкой на непустой сектор вы запустите нерабочее приложение и придется таки посылать человека жать на кнопку и передергивать питание. В моей и в Golikov A. реализации загрузчик обнаружит испорченное приложение и останется в режиме ожидания загрузки, давая возможность повторить загрузку. И ради чего ваши жертвы? Ради экономии 20 байт и 10 мс на проверку CRC приложения?


Тем не менее: "придется таки посылать человека жать на кнопку" и "получаем кирпич" немного разные вещи


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 11 2014, 18:31
Сообщение #89


Гуру
******

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



Ага%) Есть и на этот случай история у меня из раздела гусарских баллад. Был на фирме программист любил сделать код и не изнурял себя защитами. В случае не запуска на объекте он всегда был готово на обновления и не видел почему те кто на объекте так ругаются.

Вот в итоге люди на объекте устали и вызывали его на обновление в командировку. Он приехал с ноутбуком, программатором и говорит, ну где прибор, ща все исправим. Ему дали лопату, указали место и сказали: прибор на глубине 4 метров мерзлой глины под землей, выкопай его, достань и обнови, а потом там в яме его подключи так как туда выведена вся подводка и гермокапсула рабочая.

Уволился он....

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

Так что кнопка нужна, но на крайний случай...
Go to the top of the page
 
+Quote Post
grv
сообщение Oct 20 2015, 05:32
Сообщение #90


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

Группа: Участник
Сообщений: 101
Регистрация: 28-04-06
Пользователь №: 16 592



Что-то пример от ST мня загоняет в ступор

это процедура стирания флеша из исходника к AN3374
STM32F2xx in-application programming using the USART

Код
/**
  * @brief  This function does an erase of all user flash area
  * @param  StartSector: start of user flash area
  * @retval 0: user flash area successfully erased
  *         1: error occurred
  */
uint32_t FLASH_If_Erase(uint32_t StartSector)
{
  uint32_t UserStartSector = FLASH_Sector_1, i = 0;

  /* Get the sector where start the user flash area */
  UserStartSector = GetSector(APPLICATION_ADDRESS);

  for(i = UserStartSector; i <= FLASH_Sector_11; i += 8)
  {
    /* Device voltage range supposed to be [2.7V to 3.6V], the operation will
       be done by word */
    if (FLASH_EraseSector(i, VoltageRange_3) != FLASH_COMPLETE)
    {
      /* Error occurred while page erase */
      return (1);
    }
  }
  
  return (0);
}



Зачем там i+=8 ? Ну i+=4 я бы еще как то понял, т.к. запись далее идет по 32 бита.
Но сектор же стирается целиком ? Зачем вызывать процедуру стирания sectorlen/8 раз ?
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 20 2015, 07:06
Сообщение #91


Гуру
******

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



Цитата(grv @ Oct 20 2015, 08:32) *
Зачем там i+=8 ? Ну i+=4 я бы еще как то понял, т.к. запись далее идет по 32 бита.
Но сектор же стирается целиком ? Зачем вызывать процедуру стирания sectorlen/8 раз ?

Вы, похоже, не читали код и комментарии в нём. Там сказано, что эта функция стирает все секторы. То есть цикл перебирает эти секторы. Если посмотрите, что такое FLASH_Sector_0, FLASH_Sector_1 и т.д., то увидите, что это арифметическая прогрессия с разностью 8. Так что всё сходится.
Go to the top of the page
 
+Quote Post
grv
сообщение Oct 20 2015, 08:46
Сообщение #92


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

Группа: Участник
Сообщений: 101
Регистрация: 28-04-06
Пользователь №: 16 592



Цитата(scifi @ Oct 20 2015, 10:06) *
Вы, похоже, не читали код и комментарии в нём. Там сказано, что эта функция стирает все секторы. То есть цикл перебирает эти секторы. Если посмотрите, что такое FLASH_Sector_0, FLASH_Sector_1 и т.д., то увидите, что это арифметическая прогрессия с разностью 8. Так что всё сходится.



Пардон, вопрос снят, попутал FLASH_Sector_1 с



#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbyte */
#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbyte */
#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbyte */
Go to the top of the page
 
+Quote Post

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

 


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


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