Перейти к содержанию
    

Как посчитать размер HEX файла и записать это значение по заданному адресу

Входные данные: 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 файлом она не работает. Подскажите, как решить данную задачу?

Изменено пользователем haker_fox
Переместил в средства разработки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно прочитать hex файл и определить минимальный и максимальный адреса. Вывести их в консоль. И потом уже распарсить ответ и подставить куда надо

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 минут назад, VaTiKaNeTs сказал:

Так вот а как это сделать, с помощью каких команд и тулзов?

с помощью grep или awk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, HardEgor сказал:

awk

Разбираюсь с awk, мощная штука, спасибо за совет, но пока не очень понятно, как определить размер hex файла. Моя первая мысль была т.к. awk ходит по строкам, посчитать их количество и получить размер прошивки, но не получилось, т.к. данные хранятся не в ровном столбике.

testfile:

{
    i++
}
END{
	print i
}

console:

awk -f testfile /projectName.hex

Есть советы как это можно сделать, так что бы работало?

hex.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 minutes ago, VaTiKaNeTs said:

как определить размер hex файла

wc, stat

Изучайте Линукс, он рулез.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, andrew_b said:

wc, stat
Изучайте Линукс, он рулез.

Ну очевидно же, что оригинальный вопрос надо читать как "определить размер данных (макс. адрес) внутри хекс-файла". Можно, конечно, разобраться в формате hex и парсить его самостоятельно длинными регекспами, но в жизни есть и более интересные занятия.

 

@VaTiKaNeTs, у вас на выбор два варианта. Можно внимательно прочитать доку к srec_cat, оно так точно умеет, я делал. Другой вопрос, что при малейшем изменении придётся её читать заново и всё переписывать, синтаксис сложных команд там совершенно нечеловеческий. Второй варинат - взять прекрасный питоновый модуль IntelHex, и написать два десятка строчек (из них половина - расчёт CRC).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, esaulenka сказал:

Ну очевидно же, что оригинальный вопрос надо читать как "определить размер данных (макс. адрес) внутри хекс-файла".

А что есть такое "размер данных (макс. адрес) внутри хекс-файла"? И почему именно его надо определять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@esaulenka, спасибо за развернутый ответ, srec мне не понравился, нечитаемая документация, с горем пополам рассчитал CRC. Я прислушался к одному из ответов и начал использовать awk. Смог посчитать размер, написав простенький код, завтра приложу, как это сделал. Сейчас хочу и расчет CRC прописать в этом же скрипте. Пока для проблемой является, как записать полученный размер и crc в определенный адрес в hex файле.

Прошивка заканчивается по адрес 0x23xxx, а записать crc и размер надо в конец флешки, 0xFFFF8 и 0xFFFFC соответственно, что бы потом stm могла залезть по этому адресу и вычитать оттуда размер, посчитать crc и сравнить его с тем результатом, что лежит во флешке

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, VaTiKaNeTs said:

использовать awk. Смог посчитать размер, написав простенький код

Не надо так делать. Во-первых, в HEX файле некоторые строки - служебные, и содержат, например, адрес, с которого эта программа должна стартовать. Или наоборот, в hex-файле допустимы "дырки" в данных.
Т.е. посчитать-то можно, но "простенький" код при изменении входных данных может внезапно сломаться, и выдавать ПОЧТИ правильный ответ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, VaTiKaNeTs сказал:

Разбираюсь с awk, мощная штука, спасибо за совет, но пока не очень понятно, как определить размер hex файла. Моя первая мысль была т.к. awk ходит по строкам, посчитать их количество и получить размер прошивки, но не получилось, т.к. данные хранятся не в ровном столбике.

Сначала наверное стоит прочитать про формат https://ru.wikipedia.org/wiki/Intel_HEX

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@esaulenka, спасибо за предостережение, а можете поделиться, кодом, которым вы считали размер hex файла, потому что я так и не смог

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, VaTiKaNeTs said:

а записать crc и размер надо в конец флешки, 0xFFFF8 и 0xFFFFC соответственно,

Вот это как раз просто сделать (для iHex) - он содержит адрес в каждой строке. Так что просто убираете последнюю стоку (там служебная информация), дописываете строку с вашими данными с адресом FFFF8 и дописываете обратно ранее убранную последнюю строку.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, VaTiKaNeTs сказал:

можете поделиться, кодом, которым вы считали размер hex файла, потому что я так и не смог

Размер .hex-файла должна вам ваша ОС показывать. В которой вы этот .hex создали. Некий "код" для этого совсем не нужен.

11 часов назад, xvr сказал:

Так что просто убираете последнюю стоку (там служебная информация), дописываете строку с вашими данными с адресом FFFF8 и дописываете обратно ранее убранную последнюю строку.

.......и "ваши данные" оказываются в совсем неожиданном месте.  :unknw:

 

PS: Откройте описание intel-hex-формата и почитайте. Особенно в части сегментных записей.

Потом откройте какой-нить .hex-файл типа:

Цитата

:020000040C01ED                                                            
:10000000010000000050000067EC8FCD01000000EF                                
:020000040C02EC                                                            
:1000000000000000000000000000000000000000F0                                
:020000040C01ED                                                            
:20010000E00C0020618DFE1FED85FE1F678EFE1F678EFE1F678EFE1F678EFE1F00000000F1
:20012000CE2F2482A0C2FE1F00000000DB8DFE1F678EFE1F00000000678EFE1FC3A8FE1F6C
:2001400091A8FE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1FCB
:20016000678EFE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1F678EFE1FEF

...

и подумайте о назначении строк с кодом 0x04 в 4-м байте от начала. И тогда поймёте, почему ваш метод может не работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...