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

 
 
 
Reply to this topicStart new topic
> Кто считает контрольную сумму?, и зачем?
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
Сергей Борщ
сообщение Mar 11 2011, 09:37
Сообщение #2


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
_Pasha
сообщение Mar 11 2011, 09:41
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Сергей Борщ @ Mar 11 2011, 13:37) *
В LPC на месте неиспользуемого вектора по адресу 0x14

Атмелы sam7 почему-то постеснялись сделать аналогично sm.gif
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 11 2011, 09:46
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 11 2011, 10:45
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Мне тоже интересно, ибо писАл когда-то под свои нужды и под winavr, пользуюсь нечасто - могут быть глюки.

ЗЫ не знаю, прокатит ли. Там *sym файл требуется...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 11 2011, 11:07
Сообщение #6


Гуру
******

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



QUOTE (MrYuran @ Mar 11 2011, 11:46) *
Как в GCC (конкретно MSPGCC) заставить утилиту (какую?) сосчитать контрольную сумму нужной области (.text) и записать аккурат перед таблицей векторов?
На ум с подобной функциональностью приходит только SRecord. Может ли она сделать именно то, что вам нужно - не знаю, посмотрите описание.


--------------------
На любой вопрос даю любой ответ
"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
MrYuran
сообщение Mar 11 2011, 11:26
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата
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, которое потом всплывает в таблице символов.
Без полного дескрипшена пожалуй, ничего не выйдет.
Но мысль в целом понятна


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 11 2011, 11:41
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(MrYuran @ Mar 11 2011, 14:26) *
Не маловато CRC16 для кучи килобайт?

Исходнег ищу... на всякий случай
Go to the top of the page
 
+Quote Post
skripach
сообщение Mar 12 2011, 07:49
Сообщение #9


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 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
Сообщение #10


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

Группа: Участник
Сообщений: 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
skripach
сообщение Mar 14 2011, 08:03
Сообщение #11


■ ■ ■ ■
*****

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



Цитата
Измените интервалы, чтобы вторая CRC, которая по таблице векторов, не пересекалась с первой. Ну и место под нее оставить надо бы sm.gif, т.е. исключить из интервала подсчета адреса, где она лежать будет. Выделить место под нее можно несколькими способами.

Это понятно, но хотелось бы иметь одну кс на всю область.
Пробовал .BAT файл подсунуть в "Project>Options>Build_Actions>Post_Build" тоже работет, но напрягает "черный прямоугольник".
Может ещё какие варианты есть?


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


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

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



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


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

Ну и как уже написали выше, Srecord это может сделать.
Go to the top of the page
 
+Quote Post

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

 


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


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