Добавить в корзинуПозвонить
Найти в Дзене
Будни инженера

Формат HEX-файла программы для микроконтроллера AVR

Если вы только начинаете осваивать микроконтроллеры, например, крошечный ATtiny13A, то рано или поздно столкнётесь с загадочным файлом, который имеет расширение .hex. Программист называет его «прошивкой», а среда разработки выдает его после того, как вы нажмете кнопку «Собрать проект». Но что же это такое — HEX-файл? Многие думают, что это какой-то сложный машинный код, который нельзя прочитать. На самом деле всё гораздо проще. Давайте откроем этот файл обычным «Блокнотом» и посмотрим на него. И тут нас ждет сюрприз — это обычный текст! Вот как выглядит типичный HEX-файл для нашего ATtiny13A (этот файл мы получим, если скомпилируем программу из этого примера): :020000020000FC :100000000EEF07BB01E008BBB09BC19AB099C19845 :02001000FBCF24 :00000001FF Всего четыре строчки. Никаких «единичек» и «ноликов», только привычные цифры и буквы от A до F. Это и есть шестнадцатеричный код, но записанный в виде текста, чтобы его могли прочитать и человек, и программа. Разберем каждую строчку по порядку
Оглавление

Если вы только начинаете осваивать микроконтроллеры, например, крошечный ATtiny13A, то рано или поздно столкнётесь с загадочным файлом, который имеет расширение .hex. Программист называет его «прошивкой», а среда разработки выдает его после того, как вы нажмете кнопку «Собрать проект».

Но что же это такое — HEX-файл? Многие думают, что это какой-то сложный машинный код, который нельзя прочитать. На самом деле всё гораздо проще. Давайте откроем этот файл обычным «Блокнотом» и посмотрим на него. И тут нас ждет сюрприз — это обычный текст!

Вот как выглядит типичный HEX-файл для нашего ATtiny13A (этот файл мы получим, если скомпилируем программу из этого примера):

:020000020000FC
:100000000EEF07BB01E008BBB09BC19AB099C19845
:02001000FBCF24
:00000001FF

Всего четыре строчки. Никаких «единичек» и «ноликов», только привычные цифры и буквы от A до F. Это и есть шестнадцатеричный код, но записанный в виде текста, чтобы его могли прочитать и человек, и программа.

Разберем каждую строчку по порядку, как книгу.

Строчка 1: Служебная информация (необязательная)

:020000020000FC

Эта строка нужна не для самой программы, а для программы-загрузчика. Она говорит о том, с какого адреса начинается память. В среде AVR Studio она добавляется автоматически, но если её не будет — ничего страшного не случится. Это как титульный лист в книге: он есть, но можно читать и без него.

Строчка 2: Сама программа (часть 1)

:100000000EEF07BB01E008BBB09BC19AB099C19845

А вот это уже наши данные. Именно из таких строчек и состоит тело программы. Давайте разберем эту строку по косточкам:

  • Двоеточие (:) в самом начале — это «флаг». Программа-загрузчик видит его и понимает: «Ага, сейчас начнется строка формата HEX».
  • 10 — это длина цепочки данных. Записано в шестнадцатеричном виде, а в десятичном означает 16. То есть, в этой строке зашифровано 16 байтов полезной информации.
  • 0000 — это адрес в памяти микроконтроллера. Куда мы положим эти 16 байтов? Правильно, в самое начало, на адрес 0x0000.
  • 00 — это код типа строки. Для строк с данными он всегда равен 00. Это значит: «Это информация для записи в память, а не служебные данные».
  • 0EEF07BB... — это и есть наша программа. Каждые два знака (например, 0E, EF, 07) — это один байт машинного кода, который понимает микроконтроллер (напоминаю, что наименьшая единица информации в программе — это байт, поэтому значение в строке имеют каждые два знака).
  • 45 — это контрольная сумма. Специальное число, которое вычисляется из всех байтов этой строки по определённому алгоритму. Если при передаче или записи файла случится сбой и один байт изменится или потеряется, контрольная сумма не сойдется, и программа выдаст ошибку. Контрольные суммы всегда используются при передаче данных, если мы хотим быть уверены, что данные переданы правильно и в полном объёме..

Строчка 3: Сама программа (часть 2)

:02001000FBCF24

Здесь почти то же самое, но обратите внимание на адрес. Вместо 0000 здесь стоит 0010. Дело в том, что в первой строке мы записали 16 байтов в ячейки с 0 по 15. Адрес 0010 — это шестнадцатеричное число, равное десятичному числу 16. То есть, вторая часть программы идет сразу следом за первой, без пропусков.

  • Длина (02) означает, что здесь всего 2 байта данных.
  • Данные (FBCF) — это команды для контроллера.
  • Контрольная сумма (24) снова проверяет целостность.

Строчка 4: Конец файла

:00000001FF

Это стандартный «конец книги». У неё длина равна нулю (00), а код типа — 01. Прочитав эту строку, программа для прошивки понимает, что файл закончился, и пора переходить к записи данных во флеш-память.

Почему это удобно?

Такой текстовый формат очень удобен для передачи. Вы можете отправить HEX-файл по почте, открыть его на любом компьютере, и он не повредится. Кроме того, если вы опытный разработчик, вы можете даже вручную править эти строки в блокноте, чтобы изменить пару байтов, хотя новичкам так делать, конечно, не стоит (особенно потому, что для каждой строки придётся заново вычислять контрольные суммы).

Главный вывод: HEX-файл — это не лютый бинарный код, а просто упакованная в текстовый формат инструкция для вашего микроконтроллера ATtiny13A (ну или другого). В ней четко указано, какие байты и по каким адресам нужно положить в память, а контрольная сумма следит, чтобы всё было сделано правильно.

Теперь, когда вы в следующий раз увидите файл с расширением .hex, вы будете точно знать, что внутри — просто текст, написанный по определённым правилам.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить…