Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Кейл. Вставить crc бинарник.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > Keil
pvo125
Здравствуйте Все! Пытаюсь сделать следующее: хочу после компиляции и сборки чтобы кейл вычислял crc и записывал эту сумму в сам файл bin.
Нашел инструкцию в которой написано что нужно добавить options for target->user->Run user programs after Build/Rebuild сначала команду
Run#1
$K\ARM\BIN\ElfDwT.exe output\test.axf BASEADDRESS(0x08000000) которая вычислит crc кода и запишет в место в стартапе по адресу
0x0800 000+0x1c(для BASEADDRESS=0x08000000 ).
Далее
Run#2
$K\ARM\ARMCC\BIN\fromelf.exe --bin -o test.bin !L делаем из axf бинарник уже со встроенной crc.

Все получается открываю бинарник там вместо вектора в стартапе (где обычно зарезервировано 0 со смещением 0x1С) находится crc 0xBFFC824A.
Все вроде хорошо но только эта сумма не совпадает и не понятно как кейл ее считает. Проверяю так: Просто делаю бинарник в кейл с помошью такой же
вкладки но только использую одну fromelf без предварительно вставленной crc. Затем открываю в редакторе hex (Hex Editor ) и смотрю crc не совпадает.
Пробовал онлайн калькулятор crc для файлов результат аналогичный. Причем hex редактор совпадает с онлайн суммой а вот кейлом нет. Разъясните кто знает!
Хотел прикрепить бинарник пишет мне нельзя загружать такой тип файлов.
aaarrr
Цитата(pvo125 @ Oct 25 2016, 05:49) *
Хотел прикрепить бинарник пишет мне нельзя загружать такой тип файлов.

Прикрепите картинку, или просто тесктом напишите "правильное" и "неправильное" содержимое векторов.
pvo125
Файл test.bin открыт в редакторе hex. Видно что crc записана в нужное место но только эта crc (0xbffc824a) не совпадает если например в этом редакторе выделить весь бинарник целиком и отобразить контрольную сумму. Пробовал вместо CRC вписывать 0x00000000 типа как бы бинарник в котором по умолчанию по этому адресу нули. Все равно crc не та. Просто мне затем надо писать функцию на мк(stm32) которая бы считывала эту crc из файла и сравнивала его с crc самого бинарника. Но не могу понять как этот crc вычисляется в самой IDE (keil.)


aaarrr
Это не CRC, а контрольная сумма, и не всего бинарника, а только векторов. Специфичная для LPC вещь, описание можно найти в документации на процессор.

0 - 0x10001600 - 0x800028d - 0x800cbb9 - 0x8009d21 - 0x800cbb5 - 0x8001015 - 0x8012085 = 0xbffc824a
ViKo
Когда Кейл вычислил CRC, ее нельзя записывать в то место, которое потом будет участвовать в расчете CRC. Можно куда-нибудь дальше. Или не включать в расчет область векторов (где ее в данном случае хочется разместить). Ведь любой отличающийся бит влияет на результат.
И еще, а полином расчета точно одинаковый для Кейл и Hex редактора?

Ага, значит, Кейл ограничился при расчете адресами с первого указанного по последний указанный.
Я вычисляю CRC своей программой.
uriy
Цитата
Хотел прикрепить бинарник пишет мне нельзя загружать такой тип файлов.
Надо поменять расширение на txt, jpg, pdf...
Я раньше не был знаком с ElfDwT.exe
Тут прочитал http://www.keil.com/support/man/docs/uv4/uv4_ut_elfdwt.htm что он считает необходимую контрольную сумму для процов NXP.
Помнится мне в NXP ARM7 эта контрольная сумма считалась только для векторов прерываний а не для всего файла. Хотя может я что-то путаю.
pvo125
Цитата
Это не CRC, а контрольная сумма, и не всего бинарника, а только векторов. Специфичная для LPC вещь, описание можно найти в документации на процессор.

Да действительно пример был для NXP. Похоже что это вовсе не то чего я хотел(не правильно перевел да и слово checksum похоже вовсе не CRC). Отрицательный результат тоже результат. Думал автоматизировать процесс. А вообще так можно делать считать CRC бинарника и вручную вписывать это значение по адресам со смещением 0x1C. Я понял что эти 4 байта (адрес) для cortex-m зарезервированы? Так можно делать?

nvn
написать свою программу на ПК, чтоб она считала нужную вам сумму и вписывала в нужно вам место, и запускать её после fromelf'a.
я обычно так и делаю, вызываю в User Run#1 командный файл make_bin.cmd, а в нем все что мне нужно и подсчет crc и создание хидеров и шифрование и т.д.
scifi
Цитата(nvn @ Oct 25 2016, 09:53) *
написать свою программу на ПК, чтоб она считала нужную вам сумму и вписывала в нужно вам место

Эта программа уже написана. Называется srec_cat. См. тут.
mdmitry
Цитата(scifi @ Oct 25 2016, 11:25) *
Эта программа уже написана. Называется srec_cat. См. тут.

А вариант применения можно найти в этом makefile.
pvo125
Run #1
$K\ARM\ARMCC\BIN\fromelf.exe --bin -o output\test.bin !L делаю бинарник

Run #2
D:\Keil\ARM\BIN\srec_cat test.bin -BIN --crc32-l-e 0x34В90 -o test_1.bin -BIN считается crc32 для test.bin и записывается в файл test1.bin по адресу 0x34D90. Этот адрес посмотрел вручную
редактором.
Подскажите пожалуйста как писать crc в конец файла данной утилитой когда не известно предварительно размер файла test.bin. или как можно записать crc по адресу со смещением 0x1C как писал выше.
scifi
Цитата(pvo125 @ Oct 25 2016, 18:16) *
Подскажите пожалуйста как писать crc в конец файла данной утилитой когда не известно предварительно размер файла test.bin. или как можно записать crc по адресу со смещением 0x1C как писал выше.

Возможно, так:
Код
srec_cat input.bin -bin --crc32-l-e -max-addr input.bin -bin -o output.bin -output
srec_cat input.bin -bin -crop 0 0x1c -c-n-l-e 0x1C 4 4 input.bin -bin -exclude 0 0x20 -o output.bin -bin
pvo125
Точно!!! 08.gif Спасибо Вам большое долго парился c "-max". Даже нашел альтернативу сдвинуть все на 4 и записать crc в первые 4 байта.
Код
srec_cat test.bin -BIN -offset 0x4 -crc32-l-e 0x0  -o test.bin -BIN



Только в конце строчки
Код
srec_cat input.bin -bin --crc32-l-e -max-addr input.bin -bin -o output.bin -output

надо -bin а не -output
Код
srec_cat input.bin -bin --crc32-l-e -max-addr input.bin -bin -o output.bin -bin


Эта строчка
Код
srec_cat input.bin -bin -crop 0 0x1c -c-n-l-e 0x1C 4 4 input.bin -bin -exclude 0 0x20 -o output.bin -bin
делает ровно то с чего я начал топик(файл ElfDWT) со смещением 0x1C вставляет 0xBFFC824A.
Мне кажется удобнее когда или в начала crc или в конце. Мнение мое поменялось. Буду пользоваться первыми двумя. Спасибо Всем!

scifi
Хорошо, что всё хорошо.
Вообще-то srec_cat многое умеет. Документация не для слабонервных, конечно. Но, когда вникнешь, логика очевидна. Было бы полезно наваять текст для страждущих - сколько пользы было бы...
aaarrr
Цитата(scifi @ Oct 25 2016, 22:16) *
Вообще-то srec_cat многое умеет. Документация не для слабонервных, конечно. Но, когда вникнешь, логика очевидна. Было бы полезно наваять текст для страждущих - сколько пользы было бы...

А мне вот srecord как-то не приглянулся совсем. Проще на "C" набросать нужную утилиту по месту.
x893
Проще за 30-60 минут написать нужную.
svss
Цитата(aaarrr @ Oct 25 2016, 11:20) *
Это не CRC, а контрольная сумма, и не всего бинарника, а только векторов. Специфичная для LPC вещь, описание можно найти в документации на процессор.
0 - 0x10001600 - 0x800028d - 0x800cbb9 - 0x8009d21 - 0x800cbb5 - 0x8001015 - 0x8012085 = 0xbffc824a


А нельзя ли чуть подробнее про это..
То есть, да, в документации на процессор написано, что Boot проверяет сумму первых восьми из области векторов на ноль.
Однако чегой-то мой Кейл не желает вычислять эту контрольную сумму, а вовсе тупо складывает на её место в бинарник константу 0x5A5A5A5A из файла startup_lpc43xx.s.
(у меня LPC4337 Cortex M4 машина и Keil 5.12)
В результате, понятно, shadow регистр не инициализирован и процессор просто виснет.

Однако если я руками вписываю правильную контрольную сумму в startup_xx.s файл то она попадает в бинарник, и всё начинает работать как надо.
Понимаю, что я что-то пропустил. Ткните, пож., меня носом в то место где читать ..
Спасибо.
aaarrr
Цитата(svss @ Nov 9 2016, 10:42) *
Однако чегой-то мой Кейл не желает вычислять эту контрольную сумму, а вовсе тупо складывает на её место в бинарник константу 0x5A5A5A5A из файла

Не желает, наверное, потому что его об этом и не просят? У Keil'а есть отдельная утилита для прописывания суммы.
svss
Цитата(aaarrr @ Nov 9 2016, 13:51) *
Не желает, наверное, потому что его об этом и не просят? У Keil'а есть отдельная утилита для прописывания суммы.

спасибо. rolleyes.gif
к слову, IAR (7.50) , без бубна и костра делает всё как надо. это и вызвало смущение.
aaarrr
Цитата(svss @ Nov 10 2016, 07:39) *
к слову, IAR (7.50) , без бубна и костра делает всё как надо. это и вызвало смущение.

Странно: контрольная сумма векторов - это довольно убогое изобретение NXP, больше никем не используется. Без явного указания она появляться не должна.
Может, под 7.50 грузили каки-нибудь JTAG'ом, и не обратили внимание просто?
jcxz
Цитата(aaarrr @ Nov 10 2016, 09:34) *
Странно: контрольная сумма векторов - это довольно убогое изобретение NXP, больше никем не используется. Без явного указания она появляться не должна.

IAR её генерит когда в свойствах проекта в качестве целевого МК указываешь что-то из LPC. Если указать просто Cortex-M - не будет.
svss
Цитата(aaarrr @ Nov 10 2016, 12:34) *
Странно: контрольная сумма векторов - это довольно убогое изобретение NXP, больше никем не используется. Без явного указания она появляться не должна.
Может, под 7.50 грузили каки-нибудь JTAG'ом, и не обратили внимание просто?

Нет.
Взял машину (lpc4337), поставил IAR, всё заработало, поставил Keil, долго плясал с бубном, потом нашёл причину, задал здесь вопрос, проверил - работает.
После этого вернулся к IAR, убедился что он всё делает сам, включая Intel HEX (если крыжик поставить) с правильной контрольной суммой.
То есть JTAG тут рядом не лежит.
"О сколько нам открытий чудных.."

Что до того, должна ли контрольная сумма появляться, мне кажется так:
если в проекте выбрана машина NXP LPC4337, и если у этой машины в мануале написано, что без правильной контрольной суммы в области векторов ничего не будет работать,
то инструмент должен эту сумму сначала делать, а потом уже для умных крякеров объяснять как сделать так чтоб её не делать.

Цитата(jcxz @ Nov 10 2016, 13:13) *
IAR её генерит когда в свойствах проекта в качестве целевого МК указываешь что-то из LPC. Если указать просто Cortex-M - не будет.

Да, так.
aaarrr
Цитата(svss @ Nov 11 2016, 05:50) *
если в проекте выбрана машина NXP LPC4337...

То есть явно указана.

По мне, в проекте вообще не должны фигурировать "машины", а только ядра, но не буду занудствовать sm.gif
GetSmart
У двухядерных NXP читайте доки на проц внимательно, где КС по смещению 0x1C должна стоять, а где нет. Два банка по-разному.
______________
Отношение к этой безобидной КС у некоторых довольно странное. Это же не маджик црц, от которой может хвост вырасти.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.