|
|
  |
Ещё раз о бутлоадере, Некоторые тонкости. |
|
|
|
Oct 10 2007, 16:42
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Сергей Борщ @ Oct 10 2007, 18:46)  ... А на какие запросы у тебя отвечает загрузчик?" ... При наличии в сети разных устройств кроме текущей версии нужно знать еще и тип устройства, чтобы прошивку от БМВ не прошить в Боинг То есть желательно иметь команду запроса типа устройства по данному адресу. Но мы тоже экономили команды, и тип устройства содержится в нулевой странице по фиксированному адресу - то есть сравнивает типы устройств бутлоадер, и он уникальный для каждого типа устройств (если контроллер одинаковый - отличие в строке символов, определяющей тип).
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 10 2007, 16:57
|

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

|
Цитата(Dog Pawlowa @ Oct 10 2007, 19:42)  При наличии в сети разных устройств кроме текущей версии нужно знать еще и тип устройства, чтобы прошивку от БМВ не прошить в Боинг  А, ну да. У меня тип отвечается вместе с версией, поэтому я о нем и не подумал. Хорошо, все необходимые данные загрузчик может отдавать в одном ответе. Обзовем это "запросом конфигурации". Какие еще команды должен поддерживать загрузчик? И понятное дело - для разных типов и даже для одного типа, но несовместимых версий железа разные ключи шифрования, так что БМВ не взлетит
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 12 2007, 11:04
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Oct 16 2007, 18:01
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(SasaVitebsk @ Oct 10 2007, 17:35)  Вчера в 3 часа ночи получил результат 2232.  Если бы надо было байт 50 выжать ещё бы попытался, а так буду пробовать в обход. Я видишь ли с прерываниями завязался. Возможно придётся отказаться. Только вектора занимают 112 байт. Можно конечно их под себя подмять. Короче буду думу думать. Жалко выделять 4к если нехватает совсем чуть чуть. SasaVitebsk, а Вы принципиально не будете пробовать Gcc ? Стало интересно, посмотрел на исходники, ну этот код, особенно aes.c просто предназначен для компилирования gcc  на Iar там принципиально хуже... P.S. Еще очень порадовало обращение к EEPROM переменным через функции писанные на асм... Интересно, почему на Iar не воспользовались __eeprom ???
|
|
|
|
|
Oct 16 2007, 20:58
|
Гуру
     
Группа: Свой
Сообщений: 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 всё нормально, то перейдём в начало // секции программ }
|
|
|
|
|
Oct 17 2007, 09:56
|

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

|
Цитата(singlskv @ Oct 16 2007, 21:01)  Стало интересно, посмотрел на исходники, ну этот код, особенно aes.c просто предназначен для компилирования gcc  Ну так а что на "посмотрел" остановились? Попробуйте откомпилировать gcc, увидите, что без основательной "правки напильником" gcc дает в полтора раза бОльший код. И максимальная разница как раз на aes.c. Цитата(SasaVitebsk @ Oct 16 2007, 23:58)  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)
|
|
|
|
|
Oct 17 2007, 20: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, но другой протокол команды входа в программирование и сильное ужимание. косвенно это подтверждает.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|