_Desh_ 0 January 7, 2021 Posted January 7, 2021 · Report post Прошерстил форум и Интернет на предмет использования утилиты srec_cat.exe, но остались вопросы и непонятки. Мне надо добавить в конец прошивки ее CRC, с этим я справился: srec_cat.exe test_file_source.bin -binary -crc32-l-e -maximum-address test_file_source.bin -binary -o test_file.bin -binary Также хотелось бы перед формированием конечного файла прошивки увидеть в выводе IDE полученную CRC (или даже записать ее в отдельный файл). Это тоже можно сделать, например, так: srec_cat.exe test_file_source.bin -binary -fill 0xFF 0 0x400 -crop 0 0x400 -crc32-b-e 0x400 -crop 0x400 0x404 -o - -hex-dump Но как быть, если размер прошивки заранее неизвестен? Чтобы встроить вызов утилиты в IDE и полностью автоматизировать процесс, не вводя ручками каждый раз разные адреса. Во втором случае, если использовать, например, -crop -maximum-address test_file_source.bin -binary -maximum-address test_file_source.bin -binary -offset 4 вместо -crop 0x400 0x404 В консоль выводится полный дамп прошивки, а не 4 последние байта, как мне надо. Есть ли способ для утилиты srec_cat.exe указывать в качестве параметров, например, реальную длину файла, а не забивать магические константы? Quote Share this post Link to post Share on other sites More sharing options...
jcxz 84 January 7, 2021 Posted January 7, 2021 · Report post 22 минуты назад, _Desh_ сказал: Но как быть, если размер прошивки заранее неизвестен? Писать CRC не в конец, а внутрь прошивки. Quote Share this post Link to post Share on other sites More sharing options...
_Desh_ 0 January 7, 2021 Posted January 7, 2021 (edited) · Report post 6 hours ago, jcxz said: Писать CRC не в конец, а внутрь прошивки. Вопрос немного не об этом, но допустим. При попытке писать длину прошивки и CRC вместо неиспользуемых (несуществующих) векторов по заранее известному фиксированному адресу: srec_cat.exe test_file_source.bin -binary -length-l-e 0x1C -crc32-b-e 0x20 -o test_file.bin -binary srec_cat.exe выводит следующее сообщение об ошибке: srec_cat: test_file_source.bin: 0x0400: multiple 0x0000001C values (previous = 0x0C, this one = 0x00) Что это означает и как это исправить? Из документации ни черта не понятно, там есть почти такой же пример, и видимо он должен работать. P.S. Что означает ошибка примерно понял. Он мне хочет сказать, что я хочу какое-то ненулевое значение перезаписать новым значением (нулевым). Ну и что? Мне это и надо. Edited January 7, 2021 by _Desh_ Quote Share this post Link to post Share on other sites More sharing options...
_Desh_ 0 January 7, 2021 Posted January 7, 2021 (edited) · Report post Методом проб и ошибок выяснил, что перезаписать данные по некоторому адресу можно, сначала исключив этот адрес: srec_cat.exe test_file_source.bin -binary -exclude 0x1C 0x20 -length-l-e 0x1C -o test_file.bin -binary Теперь по адресу 0x1C корректно записывается длина файла. Но теперь проблема записать по адресу 0x20 значение CRC. Если исключить диапазон 0x20-0x24, то в расчете CRC он не участвует, выдается предупреждение о том, что в данных есть прореха. В принципе, при сверке CRC программно внутри контроллера можно это учесть, но получается как-то некрасиво. Есть ли более элегантный способ прописать CRC в нужный адрес? Edited January 7, 2021 by _Desh_ Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 56 January 7, 2021 Posted January 7, 2021 · Report post Потратить десяток минут на написание своей утилиты, нежели несколько дней плясать вокруг чужой. Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 62 January 7, 2021 Posted January 7, 2021 · Report post 2 часа назад, _Desh_ сказал: Теперь по адресу 0x1C корректно записывается длина файла. Ну так используйте ее для вычисления адреса, по которому сразу за концом прошивки (не забыв про необходимое выравнивание) будет лежать CRC. Я делаю именно так, правда, не использую для этого srecord. Quote Share this post Link to post Share on other sites More sharing options...