VaTiKaNeTs 0 7 июня, 2023 Опубликовано 7 июня, 2023 (изменено) · Жалоба Входные данные: OS Linux mint STM32 CUBE IDE Есть задача, посчитать CRC прошивки (hex файла). Эту задачу я выполнил, с помощью следующего кода #!/bin/bash /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/arm-none-eabi/bin/objcopy -O ihex kn_puri_stm.elf "kn_puri_stm_crc.hex" /usr/bin/srec_cat kn_puri_stm_crc.hex -Intel -fill 0xFF 0x08000000 0x08024000 -STM32 0x080FFFF8 -o kn_puri_stm_srecord.hex -Intel Но тут я задал адрес по которому считается CRC хардкорно, если моя прошивка перевалит за 0x24000, то придется переписывать скрипт. Поэтому хочу посчитать размер hex файла и засунуть этот адрес вместо 0x08024000 и потом записать его рядом с CRC по адресу 0x080FFFFC. Но как это сделать не понимаю. При работе с bin файлом работала команда srec_cat -length-b-e -max-addr, но с hex файлом она не работает. Подскажите, как решить данную задачу? Изменено 7 июня, 2023 пользователем haker_fox Переместил в средства разработки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба Нужно прочитать hex файл и определить минимальный и максимальный адреса. Вывести их в консоль. И потом уже распарсить ответ и подставить куда надо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VaTiKaNeTs 0 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба Так вот а как это сделать, с помощью каких команд и тулзов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 80 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба 56 минут назад, VaTiKaNeTs сказал: Так вот а как это сделать, с помощью каких команд и тулзов? с помощью grep или awk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VaTiKaNeTs 0 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба 1 час назад, HardEgor сказал: awk Разбираюсь с awk, мощная штука, спасибо за совет, но пока не очень понятно, как определить размер hex файла. Моя первая мысль была т.к. awk ходит по строкам, посчитать их количество и получить размер прошивки, но не получилось, т.к. данные хранятся не в ровном столбике. testfile: { i++ } END{ print i } console: awk -f testfile /projectName.hex Есть советы как это можно сделать, так что бы работало? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба 57 minutes ago, VaTiKaNeTs said: как определить размер hex файла wc, stat Изучайте Линукс, он рулез. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба питон Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба 2 hours ago, andrew_b said: wc, stat Изучайте Линукс, он рулез. Ну очевидно же, что оригинальный вопрос надо читать как "определить размер данных (макс. адрес) внутри хекс-файла". Можно, конечно, разобраться в формате hex и парсить его самостоятельно длинными регекспами, но в жизни есть и более интересные занятия. @VaTiKaNeTs, у вас на выбор два варианта. Можно внимательно прочитать доку к srec_cat, оно так точно умеет, я делал. Другой вопрос, что при малейшем изменении придётся её читать заново и всё переписывать, синтаксис сложных команд там совершенно нечеловеческий. Второй варинат - взять прекрасный питоновый модуль IntelHex, и написать два десятка строчек (из них половина - расчёт CRC). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба 17 минут назад, esaulenka сказал: Ну очевидно же, что оригинальный вопрос надо читать как "определить размер данных (макс. адрес) внутри хекс-файла". А что есть такое "размер данных (макс. адрес) внутри хекс-файла"? И почему именно его надо определять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VaTiKaNeTs 0 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба @esaulenka, спасибо за развернутый ответ, srec мне не понравился, нечитаемая документация, с горем пополам рассчитал CRC. Я прислушался к одному из ответов и начал использовать awk. Смог посчитать размер, написав простенький код, завтра приложу, как это сделал. Сейчас хочу и расчет CRC прописать в этом же скрипте. Пока для проблемой является, как записать полученный размер и crc в определенный адрес в hex файле. Прошивка заканчивается по адрес 0x23xxx, а записать crc и размер надо в конец флешки, 0xFFFF8 и 0xFFFFC соответственно, что бы потом stm могла залезть по этому адресу и вычитать оттуда размер, посчитать crc и сравнить его с тем результатом, что лежит во флешке Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба 4 minutes ago, VaTiKaNeTs said: использовать awk. Смог посчитать размер, написав простенький код Не надо так делать. Во-первых, в HEX файле некоторые строки - служебные, и содержат, например, адрес, с которого эта программа должна стартовать. Или наоборот, в hex-файле допустимы "дырки" в данных. Т.е. посчитать-то можно, но "простенький" код при изменении входных данных может внезапно сломаться, и выдавать ПОЧТИ правильный ответ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 80 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба 6 часов назад, VaTiKaNeTs сказал: Разбираюсь с awk, мощная штука, спасибо за совет, но пока не очень понятно, как определить размер hex файла. Моя первая мысль была т.к. awk ходит по строкам, посчитать их количество и получить размер прошивки, но не получилось, т.к. данные хранятся не в ровном столбике. Сначала наверное стоит прочитать про формат https://ru.wikipedia.org/wiki/Intel_HEX Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VaTiKaNeTs 0 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба @esaulenka, спасибо за предостережение, а можете поделиться, кодом, которым вы считали размер hex файла, потому что я так и не смог Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 7 июня, 2023 Опубликовано 7 июня, 2023 · Жалоба 2 hours ago, VaTiKaNeTs said: а записать crc и размер надо в конец флешки, 0xFFFF8 и 0xFFFFC соответственно, Вот это как раз просто сделать (для iHex) - он содержит адрес в каждой строке. Так что просто убираете последнюю стоку (там служебная информация), дописываете строку с вашими данными с адресом FFFF8 и дописываете обратно ранее убранную последнюю строку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 8 июня, 2023 Опубликовано 8 июня, 2023 · Жалоба 12 часов назад, VaTiKaNeTs сказал: можете поделиться, кодом, которым вы считали размер hex файла, потому что я так и не смог Размер .hex-файла должна вам ваша ОС показывать. В которой вы этот .hex создали. Некий "код" для этого совсем не нужен. 11 часов назад, xvr сказал: Так что просто убираете последнюю стоку (там служебная информация), дописываете строку с вашими данными с адресом FFFF8 и дописываете обратно ранее убранную последнюю строку. .......и "ваши данные" оказываются в совсем неожиданном месте. PS: Откройте описание intel-hex-формата и почитайте. Особенно в части сегментных записей. Потом откройте какой-нить .hex-файл типа: Цитата :020000040C01ED :10000000010000000050000067EC8FCD01000000EF :020000040C02EC :1000000000000000000000000000000000000000F0 :020000040C01ED :20010000E00C0020618DFE1FED85FE1F678EFE1F678EFE1F678EFE1F678EFE1F00000000F1 :20012000CE2F2482A0C2FE1F00000000DB8DFE1F678EFE1F00000000678EFE1FC3A8FE1F6C :2001400091A8FE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1FCB :20016000678EFE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1FEF ... и подумайте о назначении строк с кодом 0x04 в 4-м байте от начала. И тогда поймёте, почему ваш метод может не работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться