2017-02-03 6 views
0

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

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

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

Так вопросы:

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

ответ

0

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

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

Edit:

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

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

+0

Что делать, если я создаю пользовательский раздел в конце флэш-памяти и размещаю там некоторые данные, что-то вроде этого подразумевается под «сложными структурами памяти». На самом деле это не очень сложно;) Так что мне просто нужно разделить адрес на два, и это все? –