|
CRC в IAR и определение конечного адреса, Подготовка к написанию BootLoadera |
|
|
|
Sep 22 2007, 10:57
|

Гуру
     
Группа: Свой
Сообщений: 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]
--------------------
|
|
|
|
|
Sep 22 2007, 17:40
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 24 2007, 13:12
|
Группа: Новичок
Сообщений: 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]
|
|
|
|
|
Sep 26 2007, 13:40
|
Группа: Новичок
Сообщений: 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 *) использовали. ;-)
|
|
|
|
|
Sep 26 2007, 21:39
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Sep 27 2007, 08:51
|
Группа: Новичок
Сообщений: 5
Регистрация: 25-09-07
Пользователь №: 30 828

|
Цитата(Сергей Борщ @ Sep 27 2007, 00:29)  Даже и не сообразил сразу что ответить... Уже года 4 как. Ух, ты! Как я проспал! Всегда использовал свои функции для загрузки. Спасибо! В коде примера Сергея есть: Цитата crc ^= ((uint16_t)*ptr++) << 8; Имхо при сдвиге crc биты должны добавляться по одному, а не байтами. Мои загрузчики считают crc всей памяти секции приложения. В конце секции лежит crc и другие данные записанные моей внешней программой. +Нет разницы чем компилировать приложение и на каком языке написано.
|
|
|
|
|
Sep 27 2007, 09:10
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|