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

 
 
> Кто считает контрольную сумму?, и зачем?
skripach
сообщение Mar 10 2011, 15:33
Сообщение #1


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Обнаружил в логе следующее:
ielftool --checksum __vector+0x14:4,sum32:2;__vector-__vector+0x1f --verbose D:\work......
"Кто" считает эту контрольную сумму и зачем?
IAR 5.50; LPC2478.
Стал разбираться из-за того что не получалось посчитать(линкер ругается) собственную контрольную суммы начиная с 0х0-го адреса.



--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
skripach
сообщение Mar 12 2011, 07:49
Сообщение #2


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
В LPC на месте неиспользуемого вектора по адресу 0x14 хранится контрольная сумма остальных векторов. По ее совпадению встроенный загрузчик определяет, что загружена пользовательская программа и отдает ей управление.

Ясно, спасибо.
А как заставить ielftool посчитать контрольную сумму? Если ставлю галочку в опциях линкера, то получаю ошибку:
Код
ielftool error: Checksums have dependencies

из-за такого вызова ielftool:
Код
ielftool --fill 0xFF;0x0-0x3ffff --checksum __checksum:2,crc16,0x0;0x0-0x3ffff --checksum __vector+0x14:4,sum32:2;__vector-__vector+0x1f --verbose D:\work...\bl.out.tmp D:\work...\bl.out

Т.е. как я понял, нужно сначала посчитать одну кс, потом вторую, а потом ещё файл конвертировать в .hex. Пробовал это сделать в Project>Options>Build_Actions>Post_Build - работает но неудобно, длинные строчки и т.д.
Как всё же правильно считать кс.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
grinux
сообщение Mar 13 2011, 11:43
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Цитата(skripach @ Mar 12 2011, 10:49) *
Код
ielftool --fill 0xFF;0x0-0x3ffff --checksum __checksum:2,crc16,0x0;0x0-0x3ffff --checksum __vector+0x14:4,sum32:2;__vector-__vector+0x1f --verbose D:\work...\bl.out.tmp D:\work...\bl.out

Т.е. как я понял, нужно сначала посчитать одну кс, потом вторую, а потом ещё файл конвертировать в .hex. Пробовал это сделать в Project>Options>Build_Actions>Post_Build - работает но неудобно, длинные строчки и т.д.
Как всё же правильно считать кс.

Измените интервалы, чтобы вторая CRC, которая по таблице векторов, не пересекалась с первой. Ну и место под нее оставить надо бы sm.gif, т.е. исключить из интервала подсчета адреса, где она лежать будет. Выделить место под нее можно несколькими способами. Я правил icf файл так:
Код
define symbol __ICFEDIT_region_ROM_start__ = 0x00002044;
define symbol __ICFEDIT_region_ROM_end__   = 0x0003FFFB;
define symbol __checksum_region_start__       = 0x0003FFFB; /*4bytes for crc16 (aligment 4) */
define symbol __checksum_region_end__       = 0x0003FFFF;

....
define region checksum_region      = mem:[from __checksum_region_start__   to __checksum_region_end__];
.....

place in checksum_region { section .checksum     };


После этого у себя в коде:

Код
extern unsigned short const __checksum;

main()
{
   unsigned short flash_crc = CRC16_Slow(FW_INITIAL_CRC,(unsigned char *)0x2044,0x3FFFB - 0x2044 +1);
   if (flash_crc != __checksum)
     {
        hrrrrrrrr!!!
      }
}


Сообщение отредактировал grinux - Mar 13 2011, 13:06
Go to the top of the page
 
+Quote Post



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

 


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


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