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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Ещё раз о бутлоадере, Некоторые тонкости.
Dog Pawlowa
сообщение Oct 10 2007, 16:42
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Сергей Борщ @ Oct 10 2007, 18:46) *
... А на какие запросы у тебя отвечает загрузчик?" ...

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 10 2007, 16:57
Сообщение #17


Гуру
******

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



Цитата(Dog Pawlowa @ Oct 10 2007, 19:42) *
При наличии в сети разных устройств кроме текущей версии нужно знать еще и тип устройства, чтобы прошивку от БМВ не прошить в Боинг smile.gif
А, ну да. У меня тип отвечается вместе с версией, поэтому я о нем и не подумал. Хорошо, все необходимые данные загрузчик может отдавать в одном ответе. Обзовем это "запросом конфигурации". Какие еще команды должен поддерживать загрузчик?

И понятное дело - для разных типов и даже для одного типа, но несовместимых версий железа разные ключи шифрования, так что БМВ не взлетит biggrin.gif


--------------------
На любой вопрос даю любой ответ
"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
SasaVitebsk
сообщение Oct 11 2007, 09:07
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Код

2 106 bytes of CODE memory
1 430 bytes of DATA memory (+ 8 absolute )


smile.gif

Непонятно ещё какая то хрень записывает 4 байта по 00 адресу.


Короче оставлю пока 4к на бутлоадер и приступаю к отладке. Когда отлажу, тогда уберу оставшийся жирок.
Go to the top of the page
 
+Quote Post
Waso
сообщение Oct 12 2007, 08:36
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Извиняюсь что лезу в чужую тему, но есть дилетантский вопрос по ней.
Мне нужно обеспечить перепрошиваемость устройства (sam7x256) через ethernet. http и ftp сервера уже реализованы. Я планирую через ftp заливать (декриптовать находу) бинарник в свободную часть флеши и, после успешной проверки CRC, переписывать reset-вектор чтобы он указывал на начало этого бинарника.

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

Прав ли я и смогу ли я избежать танцев с бубном вокруг бутлодера?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 12 2007, 11:04
Сообщение #20


Гуру
******

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



Цитата(Waso @ Oct 12 2007, 11:36) *
Я планирую через ftp заливать (декриптовать находу) бинарник в свободную часть флеши и, после успешной проверки CRC, переписывать reset-вектор чтобы он указывал на начало этого бинарника.
Это очень плохая идея - переписывать вектора. Потому что обязательно в этот момент произойдет сбой питания и устройство окажется неработоспособным. Вектор сброса должен указывать на неизменяемую часть кода (бутлодер), который определяет куда передать управление дальше. Для остальных векторов я использую ремап.
Цитата(Waso @ Oct 12 2007, 11:36) *
А бутлодер нужен, насколько я понимаю, чтобы переписывать прошивку поверх старой, и данные при этом брать из внешнего источника.
Вовсе нет - бутлодер - это общее название (части)программы, предназначенной для обновления прошивки.


--------------------
На любой вопрос даю любой ответ
"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
Waso
сообщение Oct 15 2007, 07:02
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Спасибо за совет!
Нашел апноты. Изучаю.

Safe and Secure Firmware Upgrade for AT91SAM Microcontrollers
Safe and Secure Bootloader Implementation
Safe and Secure Bootloader Implementation (source.zip)

Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 16 2007, 10:28
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Ещё один вопрос, напрямую с бутлоадером не связанный а вот с IAR да.

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

Так вот такой вопрос.
В приложении я объявляю переменную таким образом

extern const uint32_t __flash SerialNN @ BOOTSERIAL; // Серийный номер

Так IAR генерит в hex файле по указаному адресу 00000000. Что в свою очередь плохо сказывается на файл формируемый CREATE и при заливке портит мне загрузчик. Непонятно как его вообще убрать.

Понятно что можно ручками эту строчку из HEX. Но этож будешь забывать. Понятно что потом я BLB поставлю, но хотелось бы найти нормальное решение.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 16 2007, 12:51
Сообщение #23


Гуру
******

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



Цитата(SasaVitebsk @ Oct 16 2007, 13:28) *
Так IAR генерит в hex файле по указаному адресу 00000000. Что в свою очередь плохо сказывается на файл формируемый CREATE и при заливке портит мне загрузчик. Непонятно как его вообще убрать.
__no_init const uint32_t __flash SerialNN @ BOOTSERIAL; Но как ты будешь читать серийник, если выставишь локи BLB1? Может лучше разместить в области загрузчика функцию uint16_t SerialNo() { return 0xFFFF; } в которой при прошивке менять 0xFFFF на серийник (AvReal такое умеет)? Она займет на 4 байта больше чем просто константа, но снимет все проблемы.


--------------------
На любой вопрос даю любой ответ
"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
SasaVitebsk
сообщение Oct 16 2007, 16:47
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Спасибо, но я не планирую запрещать локи на чтение.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 16 2007, 18:01
Сообщение #25


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(SasaVitebsk @ Oct 10 2007, 17:35) *
Вчера в 3 часа ночи получил результат 2232. sad.gif Если бы надо было байт 50 выжать ещё бы попытался, а так буду пробовать в обход. Я видишь ли с прерываниями завязался. Возможно придётся отказаться. Только вектора занимают 112 байт. Можно конечно их под себя подмять.
Короче буду думу думать. Жалко выделять 4к если нехватает совсем чуть чуть.
SasaVitebsk, а Вы принципиально не будете пробовать Gcc ?
Стало интересно, посмотрел на исходники, ну этот код, особенно aes.c просто предназначен для
компилирования gcc smile.gif
на Iar там принципиально хуже...

P.S. Еще очень порадовало обращение к EEPROM переменным через функции писанные на асм...
Интересно, почему на Iar не воспользовались __eeprom ???
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Oct 16 2007, 20:32
Сообщение #26


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Сергей Борщ @ Oct 16 2007, 15:51) *
__no_init const uint32_t __flash SerialNN @ BOOTSERIAL;

Разве __no_init и __flash совместимы?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 16 2007, 20:58
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



2 singlskv. Не планирую переходить на GCC. Работы завались и времени на изучение новых пакетов банально не хватает. Тем более, что я пробовал с ним работать вначале. Мне не понравилось, что по сути это не один продукт а десятки слабоинтегрированных фичей. Я, безусловно, не претендую даже на коментарии к этому продукту. Просто высказываю своё первое впечатление. Я уже обратил внимание, что есть специалисты, которым такое построение нравится. Они берут компилятор с одного источника линкер с другого, редактор с третьего а отладчик с четвёртого. Наверное это правильно. Возможно я до этого дойду, но пока - не готов. __eeprom пользуюсь. Ассемблерный файл spm выкинул и пользуюсь IARовскими приблудами. Благо Сергей Борщ предложил свой вариант. Спасибо ему.

Кто-нибудь прогу по расчёту CRC от IAR смог повторить? Что-то у меня в лоб не заработало, а подбирать на CRC - гиблый номер. Легче свою сварганить.


Я пробовал так. Вроде именно так они рекомендуют. Не причёсывал. Чтобы максимально близко к данному варианту было. Потом перепишу.
Код
#define        POLY    0x11021

inline unsigned long
crc16(int bit, unsigned long oldcrc)
{
unsigned long newcrc = (oldcrc << 1) ^ bit;
if (oldcrc & 0x80000000)
newcrc ^= POLY;
return newcrc;
}

__C_task void main(void)
{
  __disable_interrupt();

  #ifdef CRC_CHECK
    // Считаем CRC всей памяти флэш
    unsigned long crc = 0;
    unsigned char i,j;
    unsigned char APPFLASH *p = (unsigned char APPFLASH *)0x000000;
    unsigned char APPFLASH *n = (unsigned char APPFLASH *)MEM_SIZE;
    
    do
    {
      j= *p++;
      for(i=0;i<8;i++)
      {
        crc = crc16(j & 1,crc);
        j>>=1;
      }
    }
    while (--n);
    
    // Если секция программ повреждена
    // то переходим к загрузке в бутлоадер
    if (crc)  ((void (*)())loader)();            // Переходим на сам загрузчик
  #endif
        
  ((void (*)())0x0000)();                        // Если с CRC всё нормально, то перейдём в начало
                                                  // секции программ
}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 17 2007, 09:56
Сообщение #28


Гуру
******

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



Цитата(singlskv @ Oct 16 2007, 21:01) *
Стало интересно, посмотрел на исходники, ну этот код, особенно aes.c просто предназначен для компилирования gcc smile.gif
Ну так а что на "посмотрел" остановились? Попробуйте откомпилировать gcc, увидите, что без основательной "правки напильником" gcc дает в полтора раза бОльший код. И максимальная разница как раз на aes.c.


Цитата(SasaVitebsk @ Oct 16 2007, 23:58) *
Код
#define        POLY    0x11021
0x80000000 великовато. Должно быть что-то около 0x10000. Попробуй такой вариант:
Код
/*
uint16_t CRC (uint16_t crc, uint8_t data)
{
    static const unsigned short crcPoly = 0x1021;
    crc ^= (uint16_t)data << 8;
    for(uint8_t i = 0; i < 8; i++)
    {
        if ( crc & (1<<15) ) { crc <<= 1; crc ^= crcPoly; }
        else crc <<= 1;
    }
    return crc;
}
*/

uint16_t CRC(uint16_t crc, uint8_t data)
{
    static const unsigned short crcPoly = 0x1021;
    
    uint32_t m = ((uint32_t)crc << 8) | data;
    for (uint8_t i = 0; i < 8; i++)
        if ((m <<= 1) & 0x1000000)
            m ^= ((uint32_t)crcPoly << 8);

    return (uint16_t)(m >> 8);
}
Первый вариант эффективнее на 8/16-битной архитектуре, второй - на 32-битной. Считает сразу весь байт.


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


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(SasaVitebsk @ Oct 17 2007, 00:58) *
__eeprom пользуюсь. Ассемблерный файл spm выкинул и пользуюсь IARовскими приблудами. Благо Сергей Борщ предложил свой вариант. Спасибо ему.
Ну если Вы так оптимизируете свой код, то в 2K точно будет сложно влезть...
Цитата
Кто-нибудь прогу по расчёту CRC от IAR смог повторить? Что-то у меня в лоб не заработало, а подбирать на CRC - гиблый номер. Легче свою сварганить.
По расчету CRC16 опять же гляньте как это реализованно в Gcc,
там есть встроенная функция тактов на 40 (по длинне правда с циклом не сравнивал, меня
скорость обычно больше волнует).



Цитата(Сергей Борщ @ Oct 17 2007, 13:56) *
Ну так а что на "посмотрел" остановились? Попробуйте откомпилировать gcc, увидите, что без основательной "правки напильником" gcc дает в полтора раза бОльший код. И максимальная разница как раз на aes.c.
Кто бы спорил ?
Там вобще все написано левой ногой, и то что Iar справился соптимизировать этот код лучше,
еще ни о чем не говорит.
Я говорил лишь о том что данный алгоритм больше подходит для Gcc, и Ваш пост:
Цитата(Сергей Борщ @ Oct 4 2007, 16:42) *
Да. Проц - мега8. ключ 256 бит. компилятор - 4.10B. Объем кода - 1974, но есть куда ужимать. Та же мега8, WinAVR, 1888, но другой протокол команды входа в программирование и сильное ужимание.
косвенно это подтверждает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 17 2007, 20:47
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Oct 17 2007, 23:29) *
то что Iar справился соптимизировать этот код лучше,
еще ни о чем не говорит.
Я говорил лишь о том что данный алгоритм больше подходит для Gcc...

Т.е. IAR даже "алгоритм больше подхоящий для GCC" скомпилировал лучше smile.gif. Но это "ни о чем не говорит" sad.gif. Жаль smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 19:54
Рейтинг@Mail.ru


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