Память AVR и Intel hex

Я работаю над простым программистом AVR для своего университетского проекта, и я застрял в понимании того, как я могу отобразить память из шестнадцатеричного файла в фактическую флэш-память.

Например, Intel hex предоставляет нам информацию о начальном адресе блока данных, количестве байтов в нем и самих данных. Проблема заключается в том, что микроконтроллеры AVR, в частности ATmega16, часто имеют один адрес для двух байтов: старший и младший.

Сначала я написал простую функцию, которая просто считывает все данные из шестнадцатеричного файла и записывает их последовательно, увеличивая адрес на один каждые два переданных байта. К моему удивлению, он работает с простым мигающим кодом. Однако я не уверен, сработает ли этот подход, если кому-то нужна сложная структура памяти.

Итак, вопросы:

  1. Будет ли это решение работать со сложными структурами памяти?
  2. Если нет, как я могу сопоставить шестнадцатеричный адрес Intel с фактическим адресом флэш-памяти? Проблема в том, что в шестнадцатеричном формате Intel нет старших и младших байтов, только адрес = байт.

person Long Smith    schedule 03.02.2017    source источник


Ответы (1)


Intel hex использует байтовые адреса. Счетчик программ ПК относится к адресам 16-битных слов. Если вы имеете в виду, что слово «адрес» является «фактическим адресом», просто удвойте число, представляющее начальный адрес строки в шестнадцатеричном файле.

Что вы имеете в виду под «сложными структурами памяти»? Ячейкам памяти нужны уникальные адреса, независимо от того, как это адресное пространство разбито. Я не знаком с пространствами памяти программ, которые не начинаются с 0 и продолжаются линейно, но если бы была такая схема, строка в шестнадцатеричном файле Intel могла бы указывать содержимое любого непрерывного раздела памяти, начинающегося с любого адреса.

Редактировать:

Каждая строка шестнадцатеричного файла Intel может содержать не более 255 байт. Обычно данные разбиваются на блоки по 16 или 32 байта. Каждая строка содержит начальный адрес блока (который добавляется к базовому адресу, если используется). Чанк не обязательно должен начинаться с конца предыдущего, и они тоже могут быть не по порядку.

Что касается описываемых вами сложных структур памяти, они уже есть в большинстве программ. Обычно вначале есть таблица векторов, за которой следует пробел, за которым следуют crt и основная программа. Далее следуют данные для инициализации глобальных переменных. Если есть загрузчик, он помещается в специальный раздел в конце памяти.

person uncleO    schedule 03.02.2017
comment
Что, если я создам специальный раздел в конце флеш-памяти и помещу туда некоторые данные, что-то вроде этого подразумевается под сложными структурами памяти. На самом деле это не очень сложно;) Так что мне просто нужно разделить адрес на два, и это все? - person Long Smith; 04.02.2017