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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> CRC в IAR и определение конечного адреса, Подготовка к написанию BootLoadera
SasaVitebsk
сообщение Sep 22 2007, 10:24
Сообщение #1


Гуру
******

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



Доброго времени суток.
Где-то по топикам видел (не записал к сожалению), что IAR может автоматически генерить и вставлять CRC в конец проги. Хочу свой BootLoader написать и там это мне обязательно понадобится. Отсюда вопросы.
1) Как и где эту опцию включить в IAR.
2) Как из проги обратится к этой CRC (видимо какая то глобальная переменная есть, которая LINKером генерится)
3) Какая формула CRC, а лучше таблица или п/п.

Заранее спасибо.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 22 2007, 10:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(SasaVitebsk @ Sep 22 2007, 18:24) *
1) Как и где эту опцию включить в Заранее спасибо.
Project->Options->Linker->Processing->Generate Checksum...


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 22 2007, 10:36
Сообщение #3


Гуру
******

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



Цитата(SasaVitebsk @ Sep 22 2007, 13:24) *
Доброго....

В документации на линкер и дополнительно AN на IAR-овском сайте есть по нюансам алгоритмов.
То, что в проекте это для "галочки", посему в XCL файле прописывать удобнее.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 22 2007, 10:57
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Processing

With the Processing options you can specify details about how the code is generated.

Use Fill unused code memory to fill all gaps between segment parts introduced by the with the value you enter. The lcan introduce gaps either because of alignment restriction, or at the end of ranges given in segment placement options.

Use Generate checksum to checksum all generated raw data bytes. This option can only be used if the Fill unused code memory option has been specified.

Size specifies the number of bytes in the checksum, which can be 1, 2, or 4.
One of the following algorithms can be used:

Arithmetic sum Simple arithmetic sum CRC16 , generating polynomial 0x11021 (default) CRC32 CRC32, generating polynomial 0x104C11DB7 Crc polynomial CRC with a generating polynomial of the value you enter

You can also specify that the one's complement or two's complement should be used.
By default it is the most significant 1, 2, or 4 bytes (MSB) of the result that will be output, in the natural byte order for the processor. Choose LSB from the Bit order drop-down list if you want the least significant bytes to be output.

The CRC checksum is calculated as if the following code was called for each bit in the input, starting with a CRC of 0:

unsigned long crc(int bit, unsigned long oldcrc)

{

unsigned long newcrc = (oldcrc << 1) ^ bit;

if (oldcrc & 0x80000000) newcrc ^= POLY;

return newcrc;

}

POLY is the generating polynomial. The checksum is the result of the final call to this routine. If the complement is specified, the checksum is the one's or two's complement of the result.

The will place the checksum byte(s) at the __checksum label in the CHECKSUM segment. This segment must be placed using the segment placement options like any other segment. [/quote]


--------------------
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 22 2007, 14:27
Сообщение #5


Гуру
******

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



Вроде понял
получилось
-J2,crc16,1,(CODE)E4-E6

Но мне то в приложении только сгенерить надо, а читать из бута. Как прочитать CRC понятно. Привяжу к конкретному адресу. А как мне определить размер кода. То есть я хочу по результатам линковки в ячейках E6-EA разместить длину занятую кодом. Как это сделать.

Посмотрел по MAPу последним сегментом у меня идёт INITTAB. Я могу быть уверенным что он всегда в конце будет? И как конечный адрес разместить в (CODE)?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 22 2007, 15:16
Сообщение #6


Гуру
******

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



Можете завести свой сегмент и всегда линковать его в конце. Ну а конкретное решение очень простое - заводите сегмент под переменную CRC, линкуете его в конце а по фиксированному адресу размещаете адрес CRC smile.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 22 2007, 17:30
Сообщение #7


Гуру
******

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



Цитата(zltigo @ Sep 22 2007, 18:16) *
Можете завести свой сегмент и всегда линковать его в конце. Ну а конкретное решение очень простое - заводите сегмент под переменную CRC, линкуете его в конце а по фиксированному адресу размещаете адрес CRC smile.gif.

Спасибо за совет. Я так и сделаю. Я так на Асме всё время делал. Только я не знаю как именно свой сегмент (или любой другой) в конце разместить. Так чтобы адреса не указывать, а просто - последним.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 22 2007, 17:40
Сообщение #8


Гуру
******

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



Цитата(SasaVitebsk @ Sep 22 2007, 20:30) *
Так чтобы адреса не указывать, а просто - последним.

Порядок линковки в порядке перечисления:
Код
-Z(CODE)INTVEC=ROMSTART-ROMEND
......

-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
// Segment for CheckSUM
-Z(CONST)CHECKSUM=ROMSTART-ROMEND     // To end of CODE block
//-Z(CONST)CHECKSUM#ROMSTART-ROMEND    // To end of ROM block


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 23 2007, 16:00
Сообщение #9


Гуру
******

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



Спасибо огромное. beer.gif
Go to the top of the page
 
+Quote Post
igorAT
сообщение Sep 24 2007, 13:12
Сообщение #10





Группа: Новичок
Сообщений: 1
Регистрация: 24-09-07
Из: Симферополь
Пользователь №: 30 787



Доброго времени суток.
SasaVitebsk, если Вы разобрались с CRC в IAR, то прошу помощи.
MEGA32
Строка в .xcl - -J2,crc16,1,=(CODE)0-1(для пробы считаю CRC для первых
двух байт прошивки)
Значения во FLASH 0x0000=0C, 0x0001=94
На месте CHECKSUM#7FFF - af 79
В .map:
Symbol Checksum Memory Start End Initial value
------ -------- ------ ----- --- -------------
__checksum 0x79af CODE 00000000 - 00000001 0x0
Вычисляю:
Код
void crc16_buf(u08 const __flash *buf,u16 buf_size)
{
  u32 oldcrc = 0;
  u32 newcrc;
  u16 bit;
  u08 byte,count;
  
  while(buf_size){
    byte = (*buf);
    count = 7;
    do{
      if(byte & 0x80)
    bit = 1;
      else
    bit = 0;
      newcrc = (oldcrc << 1) ^ bit;
//      if(oldcrc & 0x80000000) newcrc ^= 0xA0010000;
      if(oldcrc & 0x8000) newcrc ^= 0x1021;
      oldcrc = newcrc;
      byte <<= 1;
    }while(count--);
    buf++;
    buf_size--;
  }
  crc16mb_prev = oldcrc;
}

Не получается получить такой же результат.
Может увидите где ошибаюсь
Заранее спасибо.
[/quote]
Go to the top of the page
 
+Quote Post
vladimir_ad
сообщение Sep 26 2007, 13:40
Сообщение #11





Группа: Новичок
Сообщений: 5
Регистрация: 25-09-07
Пользователь №: 30 828



Цитата(igorAT @ Sep 24 2007, 17:12) *
while(buf_size)
{
byte = (*buf);
...

А что, iar уже прямо так данные из flash берет?
Раньше для этого unsigned char __load_program_memory(unsigned char __flash *) использовали.
;-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 26 2007, 20:29
Сообщение #12


Гуру
******

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



Цитата(vladimir_ad @ Sep 26 2007, 16:40) *
А что, iar уже прямо так данные из flash берет?
Раньше для этого unsigned char __load_program_memory(unsigned char __flash *) использовали.
;-)
Даже и не сообразил сразу что ответить... Уже года 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
Сергей Борщ
сообщение Sep 26 2007, 21:39
Сообщение #13


Гуру
******

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



Цитата(igorAT @ Sep 24 2007, 16:12) *
Код
void crc16_buf(u08 const __flash *buf,u16 buf_size)
Ой, а что так страшно? Попробуйте что-то вроде такого:
Код
    uint16_t crc = 0;
    do
    {
        crc ^= ((uint16_t)*ptr++) << 8;
        uint8_t i = 8;
        do
        {
            if (crc & (1<<7))
            {
                crc <<= 1;
                crc ^= 0x1021;
            }
            else
                crc <<= 1;
        }
        while(--i);
    }
    while (--buf_size);

    crc16mb_prev =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
vladimir_ad
сообщение Sep 27 2007, 08:51
Сообщение #14





Группа: Новичок
Сообщений: 5
Регистрация: 25-09-07
Пользователь №: 30 828



Цитата(Сергей Борщ @ Sep 27 2007, 00:29) *
Даже и не сообразил сразу что ответить... Уже года 4 как.
Ух, ты! Как я проспал! Всегда использовал свои функции для загрузки. Спасибо!

В коде примера Сергея есть:
Цитата
crc ^= ((uint16_t)*ptr++) << 8;
Имхо при сдвиге crc биты должны добавляться по одному, а не байтами.


Мои загрузчики считают crc всей памяти секции приложения. В конце секции лежит crc и другие данные записанные моей внешней программой.
+Нет разницы чем компилировать приложение и на каком языке написано.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 27 2007, 09:10
Сообщение #15


Гуру
******

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



Цитата(vladimir_ad @ Sep 27 2007, 11:51) *
Имхо при сдвиге crc биты должны добавляться по одному, а не байтами.
Дальше вы видите цикл по восьми битам. Есть две схемы вычисления CRC, которые дают в итоге один и тот же численный результат. Нет разницы - добавлять по одному биту или сразу все. Более подробное объяснение с картинками мне попадалось у Б. Скляра в его "Цифровой связи".
Цитата(vladimir_ad @ Sep 27 2007, 11:51) *
Мои загрузчики считают crc всей памяти секции приложения. В конце секции лежит 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

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

 


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


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