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

Сергей Борщ
QUOTE (skripach @ Mar 10 2011, 17:33) *
и зачем?
В LPC на месте неиспользуемого вектора по адресу 0x14 хранится контрольная сумма остальных векторов. По ее совпадению встроенный загрузчик определяет, что загружена пользовательская программа и отдает ей управление.
_Pasha
Цитата(Сергей Борщ @ Mar 11 2011, 13:37) *
В LPC на месте неиспользуемого вектора по адресу 0x14

Атмелы sam7 почему-то постеснялись сделать аналогично sm.gif
MrYuran
Чтоб не плодить сущности, немного спрошу тут же у знающих людей sm.gif
Как в GCC (конкретно MSPGCC) заставить утилиту (какую?) сосчитать контрольную сумму нужной области (.text) и записать аккурат перед таблицей векторов?
Чтобы затем внутренний селф-тест запущенной программы получил 0
_Pasha
Мне тоже интересно, ибо писАл когда-то под свои нужды и под winavr, пользуюсь нечасто - могут быть глюки.

ЗЫ не знаю, прокатит ли. Там *sym файл требуется...
Сергей Борщ
QUOTE (MrYuran @ Mar 11 2011, 11:46) *
Как в GCC (конкретно MSPGCC) заставить утилиту (какую?) сосчитать контрольную сумму нужной области (.text) и записать аккурат перед таблицей векторов?
На ум с подобной функциональностью приходит только SRecord. Может ли она сделать именно то, что вам нужно - не знаю, посмотрите описание.
MrYuran
Цитата
ti-txt
The TI-TXT format is understood for reading and writing. This format is used with the bootstrap loader of the Texas Instruments MSP430 family of processors

Звучит обнадёживающе sm.gif
Спасибо, будем копать...

Цитата(_Pasha @ Mar 11 2011, 13:45) *
Мне тоже интересно, ибо писАл когда-то под свои нужды и под winavr, пользуюсь нечасто - могут быть глюки.

ЗЫ не знаю, прокатит ли. Там *sym файл требуется...

Не маловато CRC16 для кучи килобайт?
Насколько я понял, в тексте должно быть заготовлено место под CS, которое потом всплывает в таблице символов.
Без полного дескрипшена пожалуй, ничего не выйдет.
Но мысль в целом понятна
_Pasha
Цитата(MrYuran @ Mar 11 2011, 14:26) *
Не маловато CRC16 для кучи килобайт?

Исходнег ищу... на всякий случай
skripach
Цитата
В 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 - работает но неудобно, длинные строчки и т.д.
Как всё же правильно считать кс.
grinux
Цитата(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!!!
      }
}
skripach
Цитата
Измените интервалы, чтобы вторая CRC, которая по таблице векторов, не пересекалась с первой. Ну и место под нее оставить надо бы sm.gif, т.е. исключить из интервала подсчета адреса, где она лежать будет. Выделить место под нее можно несколькими способами.

Это понятно, но хотелось бы иметь одну кс на всю область.
Пробовал .BAT файл подсунуть в "Project>Options>Build_Actions>Post_Build" тоже работет, но напрягает "черный прямоугольник".
Может ещё какие варианты есть?
grinux
Цитата(skripach @ Mar 14 2011, 11:03) *
Это понятно, но хотелось бы иметь одну кс на всю область.
Пробовал .BAT файл подсунуть в "Project>Options>Build_Actions>Post_Build" тоже работет, но напрягает "черный прямоугольник".
Может ещё какие варианты есть?


Сейчас попробовал у себя так: target не NXP (ARM7 попробовал, работает). В этом случае кс по векторам при вызове ielftool не считается и можно расширить интервалы общей кс.

Ну и как уже написали выше, Srecord это может сделать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.