Jump to content

    

Кейл. Вставить crc бинарник.

Здравствуйте Все! Пытаюсь сделать следующее: хочу после компиляции и сборки чтобы кейл вычислял 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 редактор совпадает с онлайн суммой а вот кейлом нет. Разъясните кто знает!

Хотел прикрепить бинарник пишет мне нельзя загружать такой тип файлов.

 

Share this post


Link to post
Share on other sites
Хотел прикрепить бинарник пишет мне нельзя загружать такой тип файлов.

Прикрепите картинку, или просто тесктом напишите "правильное" и "неправильное" содержимое векторов.

Share this post


Link to post
Share on other sites

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

 

test.jpg

post-81299-1477371595_thumb.jpg

Share this post


Link to post
Share on other sites

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

 

0 - 0x10001600 - 0x800028d - 0x800cbb9 - 0x8009d21 - 0x800cbb5 - 0x8001015 - 0x8012085 = 0xbffc824a

Share this post


Link to post
Share on other sites

Когда Кейл вычислил CRC, ее нельзя записывать в то место, которое потом будет участвовать в расчете CRC. Можно куда-нибудь дальше. Или не включать в расчет область векторов (где ее в данном случае хочется разместить). Ведь любой отличающийся бит влияет на результат.

И еще, а полином расчета точно одинаковый для Кейл и Hex редактора?

 

Ага, значит, Кейл ограничился при расчете адресами с первого указанного по последний указанный.

Я вычисляю CRC своей программой.

Share this post


Link to post
Share on other sites
Хотел прикрепить бинарник пишет мне нельзя загружать такой тип файлов.
Надо поменять расширение на txt, jpg, pdf...

Я раньше не был знаком с ElfDwT.exe

Тут прочитал http://www.keil.com/support/man/docs/uv4/uv4_ut_elfdwt.htm что он считает необходимую контрольную сумму для процов NXP.

Помнится мне в NXP ARM7 эта контрольная сумма считалась только для векторов прерываний а не для всего файла. Хотя может я что-то путаю.

Share this post


Link to post
Share on other sites
Это не CRC, а контрольная сумма, и не всего бинарника, а только векторов. Специфичная для LPC вещь, описание можно найти в документации на процессор.

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

 

 

Share this post


Link to post
Share on other sites

написать свою программу на ПК, чтоб она считала нужную вам сумму и вписывала в нужно вам место, и запускать её после fromelf'a.

я обычно так и делаю, вызываю в User Run#1 командный файл make_bin.cmd, а в нем все что мне нужно и подсчет crc и создание хидеров и шифрование и т.д.

Share this post


Link to post
Share on other sites
написать свою программу на ПК, чтоб она считала нужную вам сумму и вписывала в нужно вам место

Эта программа уже написана. Называется srec_cat. См. тут.

Share this post


Link to post
Share on other sites
Эта программа уже написана. Называется srec_cat. См. тут.

А вариант применения можно найти в этом makefile.

Share this post


Link to post
Share on other sites

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 как писал выше.

Share this post


Link to post
Share on other sites
Подскажите пожалуйста как писать 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

Share this post


Link to post
Share on other sites

Точно!!! :08: Спасибо Вам большое долго парился 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 или в конце. Мнение мое поменялось. Буду пользоваться первыми двумя. Спасибо Всем!

 

 

Share this post


Link to post
Share on other sites

Хорошо, что всё хорошо.

Вообще-то srec_cat многое умеет. Документация не для слабонервных, конечно. Но, когда вникнешь, логика очевидна. Было бы полезно наваять текст для страждущих - сколько пользы было бы...

Share this post


Link to post
Share on other sites
Вообще-то srec_cat многое умеет. Документация не для слабонервных, конечно. Но, когда вникнешь, логика очевидна. Было бы полезно наваять текст для страждущих - сколько пользы было бы...

А мне вот srecord как-то не приглянулся совсем. Проще на "C" набросать нужную утилиту по месту.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this