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

Размещение массива в памяти программ

Подскажите пожалуйста такую штуку. Мне нужно разместить 600 шт констант в памяти программ (t2313). В дальнейшем по необходимости редактировать непосредственно сам скомпилированный hex меняя значения констант, но без перекомпиляции. Редактировать и прошивать будет специальная программа. Собственно вопрос как адресно разместить константы в памяти программ чтобы точно знать какой байт в каком случае менять? Спасибо.

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


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

Для этого есть несколько вариантов.

1. Вы вообще не размещаете данный массив. При компиляции генерируете линкером файл map и в нём находите куда линкер его разместил. Соответственно в программе - редакторе задаёте адрес массива. Я бы пошёл этим путём.

2. Вы объявляете свою секцию в линкере, а в программе размещаете массив в данной секции. Адрес секции прописываете за пределами секции программ с какого-то кратного адреса. Этот адрес и используете для доступа.

 

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


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

Файл map идея хорошая. Только чтобы не получилось, что надо отыскивать все 600. А так чтобы конкретно указать, что константа konst1 дложна лежать по адресу 0x0100 к примеру?

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


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

по необходимости редактировать непосредственно сам скомпилированный hex меняя значения констант, но без перекомпиляции.

 

Есть специальные правила оформления Hex-файла (т.е. формат файла), где ,например, в конце каждой строки записывается контрольная сумма этой строки. Кто ее будет пересчитывать? Вручную? или писать спец прогу для этого? Хотя у Вас будет своя прога для изменения и прошивки, но Вы тогда должны знать полный формат Hex-файла, чтобы определить позицию для изменения

 

Лучше всего менять не в Hex-файле, а в сконвертированном из него bin-файле (реализаций hex2bin.exe куча).

bin-файл - это линейный образ проги в памяти МК. Поэтому (чисто мое мнение), лучше создать свою секцию по определенному адресу и зная этот адрес можно изменить любую константу.

Пример, базовый адрес BASE=0x400, относительный адрес konst1 = 0x100, следовательно, абсолютный адрес konst1= BASE + 0x100 = 0x500 !!!!

 

Вопрос. Памяти 2К, а констант 600 байт. Следовательно, на прогу выходит 1448 байт. Хватит? или прога тупо пересылает эти константы в какое-либо устройство?

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


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

...чтобы конкретно указать, что константа konst1 дложна лежать по адресу 0x0100 к примеру?

 

в скудном хэлпе на азм вы найдёте магическую дерективу

 

.org

 

применима к любому сегменту программы: коду, данным, статике...

 

удачи вам

(круглый)

 

 

...Редактировать и прошивать будет специальная программа. Собственно вопрос как адресно разместить константы в памяти программ чтобы точно знать какой байт в каком случае менять?..

 

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

а) конкретному смещению. (как уже было сказано выше - инструкция .org вам в помощь)

б) по определённой метке. (тут просто перед константой помещаете свою фамилию в текстовом виде. в последствии её и ищите в хексе)

 

 

удачи вам

(круглый)

 

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


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

Редактировать и прошивать будет специальная программа. Собственно вопрос как адресно разместить константы в памяти программ чтобы точно знать какой байт в каком случае менять?

Для ответа на этот вопрос надо знать какой у Вас компилятор. Как правило в препроцессоре есть директивы по размещению констант по определенному адресу. Но вот не помешает ли это линкеру размещать остальные переменные и саму программу?

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


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

Лучше всего менять не в Hex-файле, а в сконвертированном из него bin-файле (реализаций hex2bin.exe куча).

bin-файл - это линейный образ проги в памяти МК. Поэтому (чисто мое мнение), лучше создать свою секцию по определенному адресу и зная этот адрес можно изменить любую константу.

Пример, базовый адрес BASE=0x400, относительный адрес konst1 = 0x100, следовательно, абсолютный адрес konst1= BASE + 0x100 = 0x500 !!!!

Где можно почитать про эти bin? Как их лить в контроллер и чем бы скомпилировать? Памяти хватит. Также рассматривается вариант Т861, на всякий пожарный. Компилятор WinAVR-2010.
Изменено пользователем skyled

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


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

Где можно почитать про эти bin?

 

Здеся!!!

Бинарный файл в общем случае - это последовательность произвольных (а не только текстовых) символов.

В нашем случае - это образ (дамп) flash-памяти МК, который содержит исполняемый код (машинные инструкции) и данные

Конвертируется из hex-файла специальными утилитами. одну я уже упоминал - hex2bin.exe. В инете их можно найти кучу. Я в Дельфях сделал свою примерно за полтора часа.

Любой программатор программирует МК БИНАРНЫМИ данными, а не в HEX'овом виде, перевод осуществляется перед прошивкой.

Проще говоря HEX-формат - это текстовая запись любых бинарных данных в текстовом виде

 

Например -

:103510009AE010929E0A019690939B0A80939A0AD1

: - обязательный признак

10 - длина данных =16 (в 16-тиричном виде)

3510 - смещение

00 - команда что строка с данными(еще есть 01,02,03,04)

9AE010929E0A019690939B0A80939A0A - 16 байт полезной нагрузки

D1 - контрольная сумма

 

Насчет привязки объекта в WinAVR

 

// привязка секции (имени) к определенному адресу

// выполняется в Настройках Проекта => Custom Options => Linker Options

 

-Wl,--section-start=.TableCoef=0x0800

// адрес в БАйтах

 

 

// привязка объекта к фиксированной по адресу секции (имени)

 

ubyte tcoef2[2] __attribute__((section(".TableCoef"))) =

{

// #include "coef2.h"

};

 

// взятие адреса

register ubyte *address ;// asm("r14");

address = (ubyte*)tcoef2;

bplis = pgm_read_byte( address++);

 

// содержание coef2.h :

 

0x05,0x09,0xEB,0xA5,0xDD,0xCA // comment

,0x05,0x08,0x22,0xE2,0x2A,0xAB

,0x09,0x00,0x08,0x00,0x80,0x00, 0x81,0x08,0x88,0x00

 

У меня использовался массив, но можно сделать и набор любых объектов

 

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


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

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

 

Все программы уже написаны до нас: http://smarttechnosoft.com/ihex/

 

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


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

Все программы уже написаны до нас

 

У Вас есть лишние 20 бакинских?? Тогда лучше высылайте их мне!!!

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


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

У Вас есть лишние 20 бакинских?? Тогда лучше высылайте их мне!!!

Во-первых можно заставить купить вашего работодателя, пусть не жмотится.

Во-вторых, 30 строк можно редактировать бесплатно, мне этого хватает, я редактирую данные в EEPROM.

В-третьих, если не хватает, то можно уменьшить число строк, увеличив длину каждой строки, а на длину там ограничения нет (кажется).

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


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

Я объявил в WinAVR массив и посмотрел как расположились мои данные. Тот факт, что они идут друг за другом несколько развязывает руки. Тепрь моя задача написать программу для редактирования этого hex-а. Собственно вопрос как правильно (алгоритм) разобрать этот файл.

Предположим я прочитал в массив файл (длянна известна и постоянна). В каком месте мне искать мои данные и куда писать подсчитанную контрольную сумму? Если я открою hex notepad-ом, то то что видится так и есть? Скрытого ничего нет? Для примера привожу сам hex и редактор (спасибо кому-то из форумчан). Мои данные лежат от адреса 0x000027 до 0x000044 включительно. Спасибо.

prg_con.zip

HexFile_Editor.zip

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


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

Во-первых можно заставить купить вашего работодателя, пусть не жмотится.

 

Нахрена покупать, если мне работы на полтора часа, да и заодно Delphi/Pascal вспомню

 

Во-вторых, 30 строк можно редактировать бесплатно, мне этого хватает, я редактирую данные в EEPROM.

 

С EEPROM согласен, но Flash-память немного больше. Например рядовая программа занимает ~1200 строк в выходном hex-файле

 

В-третьих, если не хватает, то можно уменьшить число строк, увеличив длину каждой строки, а на длину там ограничения нет (кажется).

 

Длина ограничена форматом HEX-файла - для длины строки дается две позиции - это 255 значений!!!

 

2 skyled

Повторяю ХЕКС-файл - это простой текстовый файл, написаный по определенным правилам(см пост №9)

 

Привожу алгоритм работы программы (не пользователя!!)

 

Первый вариант:

1. Открываешь hex-файл

2. Преобразоваваешь его в бинарный вид

3. редактируешь необходимую информацию

4. при необходимости - конвертируешь обратно в хекс

5. сохраняешь результаты

 

Второй вариант

1. Открываешь hex-файл

2. вычисляешь местоположение необходимых данных - оно не совсем линейное

3. изменяешь данные и коректно их записываешь

4. ЗАНОВО вычисляешь и записываешь контрольную сумму

5. сохраняешь результаты

 

Я работал почти по первому варианту.

Конвертирование в бин ставил в конце работы компилятора в настройках среды

Мне известные программаторы принимали в качестве загрузочного файлы и ХЕКС и БИН

Изменено пользователем alexeyv

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


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

Предположим я преобразую hex в бинарный вид. Как мне там найти те байты, где мой массив лежит? Преобразование часом не заключается в том, чтобы выкинуть из hex лишнее?

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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