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

 
 
> Ещё раз о бутлоадере, Некоторые тонкости.
SasaVitebsk
сообщение Oct 4 2007, 09:17
Сообщение #1


Гуру
******

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



Задумка такая.

По старту попадаем в бут. Там считаем CRC и если Ok - выходим на саму приложение. Если не Ok то переходим на сам лодырь.

В приложении по команде переходим непосредственно на лоадырь.


То есть мне надо две точки входа. По сбросу и по команде. Хотелось бы использовать незадействованные вектора бутлоадера. Например +2. Как это сделать. Если использовать pragma location, то наверняка будет linker ругаться.

Конечно можно упростить задачу и использовать какой нибудь признак в EEPROM. Или портить CRC к примеру, но что-то мне не нравится такой подход.

А кто как делает?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Oct 16 2007, 20:58
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
singlskv
сообщение Oct 17 2007, 20:29
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 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
SasaVitebsk
сообщение Oct 18 2007, 19:35
Сообщение #4


Гуру
******

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



Цитата(singlskv @ Oct 17 2007, 23:29) *
Ну если Вы так оптимизируете свой код, то в 2K точно будет сложно влезть...
По расчету CRC16 опять же гляньте как это реализовано в Gcc,
там есть встроенная функция тактов на 40 (по длинне правда с циклом не сравнивал, меня
скорость обычно больше волнует).


bb-offtopic.gif
Уважаемый. Бут оптимизируется по коду. В программе встречается 1 вызов п/п чтения EEPROM и 1 вызов записи. Библиотеки на Яре написаны на Асме. Я их смотрел, и честно говоря в 5 операторах ассемблера не нашёл ничего из ряда вон. Да и был бы очень удивлён если бы нашёл. Так ответьте мне причём здесь применение данных п/п к оптимизации. Совершенно очевидно что на этих двух вызовах можно сэкономить ну от силы пару байтов. Речь вначале шла о сотне!

То же касается и CRC16. Я не спрашивал как её написать оптимально. Я не думаю, что написанное мной на ассемблере будет хуже вашего. Во всяком случае значительно. Я просто интересовался как именно IAR генерит CRC. Я переписал на АСМ весь свой WAKE протокол и думаю всётаки влезть в 2к. Переписал потому, что всё это реализовано по прерываниям и логически вообще не связано с самим бутом.

Подытоживая всё выше сказанное, хочется чтобы вы более конкретно обдумывали свои посты.
==========================================

Теперь по существу вопроса. Пишу это, так как только на этой странице уже поднимался вопрос по генерации CRC IARом. И думаю люди будут как и я пытаться его использовать. Для тех кто интересуется сообщаю следующее.

При размещении CRC по разным адресам сам CRC не меняется. Из чего я делаю вывод (возможно некорректный, но это то что первое приходит в голову), что CRC считается только CODE области и размещается где указано. Это не позволяет мне его использовать так как я хочу. Наверное есть опция какая-то, но я не разобрался.

Решил написать программу, которая будет считать CRC и вставлять её в нужное место прямо в HEX файле. Постораюсь написать её максимально универсально, причесать и выложить на форуме AVR для использования желающими.

Ещё один момент - прога CREATE из набора идущего к AES. В ней есть хомут. При размещении данных (CRC) в последних двух ячейках секции пользователя CREATE начинает кричать оверлапинг. При размещении CRC на две ячейки меньше, выполняет операцию, но в прошивке вы получите дополнительно два байта мусора. Исходники там приведены, но я не стал разбираться, так как всё равно не чем её откомпилить. В принципе это не страшно, просто поясняю для того, кто пойдёт по моим стопам. smile.gif

У меня - всё работает. Спасибо всем тем кто принял участие в обсуждении. Особенное спасибо Сергей Борщ за, просто неоценимую, конкретную помощь знающего человека.

Тему не закрываю, возможно ещё что возникнет.
Влезу или не влезу, для любопытных - напишу позже. smile.gif.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 18 2007, 20:40
Сообщение #5


Гуру
******

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



Цитата(SasaVitebsk @ Oct 18 2007, 22:35) *
так как всё равно не чем её откомпилить.
Dev C++В комплекте исходников идут и файлы проекта под этот компилятор.
Цитата(SasaVitebsk @ Oct 18 2007, 22:35) *
Ещё один момент - прога CREATE из набора идущего к AES. В ней есть хомут. При размещении данных (CRC) в последних двух ячейках секции пользователя CREATE начинает кричать оверлапинг. При размещении CRC на две ячейки меньше, выполняет операцию, но в прошивке вы получите дополнительно два байта мусора.
Естественно, потому что CREATE сама считает CRC (по полиному 0x8005) и располагает его в последних двух байтах секции приложения. Поэтому меня несколько ввело в замешательство ваше желание считать CRC при помощи линкера. При этом CREATE кoрректо считает все свободные ячейки заполненными 0xFFFF, в то время как линкер считает, что все свободные места между сегментами заполнены нулями.


--------------------
На любой вопрос даю любой ответ
"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 4 2007, 09:17
- - Сергей Борщ   Цитата(SasaVitebsk @ Oct 4 2007, 12:17) Х...   Oct 4 2007, 09:37
|- - IJAR   Цитата(Сергей Борщ @ Oct 4 2007, 13:37) Е...   Oct 9 2007, 11:40
|- - Сергей Борщ   Цитата(IJAR @ Oct 9 2007, 14:40) А какой ...   Oct 9 2007, 12:01
|- - IJAR   Цитата(Сергей Борщ @ Oct 9 2007, 16:01) Ч...   Oct 9 2007, 12:33
|- - Сергей Борщ   Цитата(IJAR @ Oct 9 2007, 15:33) Но есть ...   Oct 9 2007, 14:33
- - SasaVitebsk   Спасибо Сергей. Всё доступно объяснил. Подходят о...   Oct 4 2007, 19:14
- - arttab   а почему бы не объявить переменную в озу в загрузч...   Oct 7 2007, 14:34
|- - Сергей Борщ   Цитата(arttab @ Oct 7 2007, 17:34) В загр...   Oct 8 2007, 08:16
- - IJAR   Цитата(SasaVitebsk @ Oct 4 2007, 13:17) З...   Oct 9 2007, 07:28
|- - Сергей Борщ   Цитата(IJAR @ Oct 9 2007, 10:28) 1. Испол...   Oct 9 2007, 10:45
- - SasaVitebsk   Сергей, всётаки по коду не уложился в 2к. Со своим...   Oct 9 2007, 23:55
|- - Сергей Борщ   Цитата(SasaVitebsk @ Oct 10 2007, 02:55) ...   Oct 10 2007, 10:58
|- - SasaVitebsk   Цитата(Сергей Борщ @ Oct 10 2007, 13:58) ...   Oct 10 2007, 13:35
|- - Сергей Борщ   Цитата(SasaVitebsk @ Oct 10 2007, 16:35) ...   Oct 10 2007, 15:46
||- - Dog Pawlowa   Цитата(Сергей Борщ @ Oct 10 2007, 18:46) ...   Oct 10 2007, 16:42
||- - Сергей Борщ   Цитата(Dog Pawlowa @ Oct 10 2007, 19:42) ...   Oct 10 2007, 16:57
|- - singlskv   Цитата(SasaVitebsk @ Oct 10 2007, 17:35) ...   Oct 16 2007, 18:01
|- - Сергей Борщ   Цитата(singlskv @ Oct 16 2007, 21:01) Ста...   Oct 17 2007, 09:56
- - SasaVitebsk   Код 2 106 bytes of CODE memory 1 430 bytes of D...   Oct 11 2007, 09:07
- - Waso   Извиняюсь что лезу в чужую тему, но есть дилетантс...   Oct 12 2007, 08:36
|- - Сергей Борщ   Цитата(Waso @ Oct 12 2007, 11:36) Я плани...   Oct 12 2007, 11:04
- - Waso   Спасибо за совет! Нашел апноты. Изучаю. Safe ...   Oct 15 2007, 07:02
- - SasaVitebsk   Ещё один вопрос, напрямую с бутлоадером не связанн...   Oct 16 2007, 10:28
|- - Сергей Борщ   Цитата(SasaVitebsk @ Oct 16 2007, 13:28) ...   Oct 16 2007, 12:51
|- - IgorKossak   Цитата(Сергей Борщ @ Oct 16 2007, 15:51) ...   Oct 16 2007, 20:32
- - SasaVitebsk   Спасибо, но я не планирую запрещать локи на чтение...   Oct 16 2007, 16:47
|- - zltigo   Цитата(singlskv @ Oct 17 2007, 23:29) то ...   Oct 17 2007, 20:47
||- - singlskv   Цитата(zltigo @ Oct 18 2007, 00:47) Т.е. ...   Oct 17 2007, 20:57
||- - zltigo   Цитата(singlskv @ Oct 17 2007, 23:57) Опя...   Oct 17 2007, 21:12
||- - singlskv   Цитата(zltigo @ Oct 18 2007, 01:12) Конте...   Oct 17 2007, 21:53
||- - zltigo   Цитата(singlskv @ Oct 18 2007, 00:53) Ско...   Oct 17 2007, 22:04
||- - singlskv   Цитата(zltigo @ Oct 18 2007, 02:04) Легко...   Oct 17 2007, 22:24
||- - zltigo   Цитата(singlskv @ Oct 18 2007, 01:24) а п...   Oct 17 2007, 22:35
||- - singlskv   Цитата(zltigo @ Oct 18 2007, 02:35) В aes...   Oct 17 2007, 22:55
|- - zltigo   Цитата(SasaVitebsk @ Oct 18 2007, 22:35) ...   Oct 18 2007, 22:05
|- - singlskv   To zltigo и SasaVitebsk, признаю, погорячился насч...   Oct 18 2007, 22:48
|- - zltigo   Цитата(singlskv @ Oct 19 2007, 01:48) Спр...   Oct 19 2007, 07:31
|- - Непомнящий Евгений   Цитата(singlskv @ Oct 19 2007, 02:48) Ну ...   Oct 19 2007, 07:37
|- - zltigo   Цитата(Непомнящий Евгений @ Oct 19 2007, 10...   Oct 19 2007, 08:01
- - Непомнящий Евгений   Если максимальная оптимизация по размеру, то первы...   Oct 19 2007, 08:33
|- - singlskv   Цитата(Непомнящий Евгений @ Oct 19 2007, 11...   Oct 19 2007, 15:08
|- - SasaVitebsk   Цитата(singlskv @ Oct 19 2007, 18:08) А о...   Oct 20 2007, 20:07
|- - singlskv   Цитата(SasaVitebsk @ Oct 21 2007, 00:07) ...   Oct 21 2007, 17:28
|- - pvp   Цитата(singlskv @ Oct 21 2007, 21:28) __z...   Oct 22 2007, 15:24
|- - Сергей Борщ   Цитата(pvp @ Oct 22 2007, 18:24) Поясните...   Oct 22 2007, 15:33
|- - pvp   Цитата(Сергей Борщ @ Oct 22 2007, 19:33) ...   Oct 23 2007, 14:02
- - SasaVitebsk   Внимательно просмотрю. Правда я отказался на сегод...   Oct 22 2007, 10:43
|- - singlskv   Цитата(SasaVitebsk @ Oct 22 2007, 14:43) ...   Oct 22 2007, 16:43
- - SasaVitebsk   Я когда первый раз увидел результаты компилировани...   Oct 22 2007, 21:24
- - skripach   Не стал создавать новую тему, поэтому здесь. Можно...   Nov 9 2009, 14:11
- - skripach   Что никто не знает? ...или я что-то не то спросил.   Nov 12 2009, 07:30
|- - zltigo   Цитата(skripach @ Nov 12 2009, 10:30) Что...   Nov 12 2009, 09:39
- - KSN   Есть вопрос по прерываниям в bootloader и applicat...   Feb 27 2010, 09:55
- - Сергей Борщ   Цитата(KSN @ Feb 27 2010, 11:55) Может у ...   Feb 27 2010, 11:39


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

 


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


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