реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Размещение массива в памяти программ, с последующим редактированием hex при перепрошивке
skyled
сообщение Jan 12 2011, 05:20
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Подскажите пожалуйста такую штуку. Мне нужно разместить 600 шт констант в памяти программ (t2313). В дальнейшем по необходимости редактировать непосредственно сам скомпилированный hex меняя значения констант, но без перекомпиляции. Редактировать и прошивать будет специальная программа. Собственно вопрос как адресно разместить константы в памяти программ чтобы точно знать какой байт в каком случае менять? Спасибо.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 12 2011, 05:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Для этого есть несколько вариантов.
1. Вы вообще не размещаете данный массив. При компиляции генерируете линкером файл map и в нём находите куда линкер его разместил. Соответственно в программе - редакторе задаёте адрес массива. Я бы пошёл этим путём.
2. Вы объявляете свою секцию в линкере, а в программе размещаете массив в данной секции. Адрес секции прописываете за пределами секции программ с какого-то кратного адреса. Этот адрес и используете для доступа.
Go to the top of the page
 
+Quote Post
skyled
сообщение Jan 12 2011, 05:45
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Файл map идея хорошая. Только чтобы не получилось, что надо отыскивать все 600. А так чтобы конкретно указать, что константа konst1 дложна лежать по адресу 0x0100 к примеру?
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jan 12 2011, 06:26
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



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


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

Лучше всего менять не в Hex-файле, а в сконвертированном из него bin-файле (реализаций hex2bin.exe куча).
bin-файл - это линейный образ проги в памяти МК. Поэтому (чисто мое мнение), лучше создать свою секцию по определенному адресу и зная этот адрес можно изменить любую константу.
Пример, базовый адрес BASE=0x400, относительный адрес konst1 = 0x100, следовательно, абсолютный адрес konst1= BASE + 0x100 = 0x500 !!!!

Вопрос. Памяти 2К, а констант 600 байт. Следовательно, на прогу выходит 1448 байт. Хватит? или прога тупо пересылает эти константы в какое-либо устройство?
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jan 12 2011, 06:34
Сообщение #5


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(skyled @ Jan 12 2011, 11:45) *
...чтобы конкретно указать, что константа konst1 дложна лежать по адресу 0x0100 к примеру?


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

.org

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

удачи вам
(круглый)


Цитата(skyled @ Jan 12 2011, 11:20) *
...Редактировать и прошивать будет специальная программа. Собственно вопрос как адресно разместить константы в памяти программ чтобы точно знать какой байт в каком случае менять?..


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


удачи вам
(круглый)
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 12 2011, 07:11
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата(skyled @ Jan 12 2011, 11:20) *
Редактировать и прошивать будет специальная программа. Собственно вопрос как адресно разместить константы в памяти программ чтобы точно знать какой байт в каком случае менять?

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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
skyled
сообщение Jan 12 2011, 07:11
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Цитата
Лучше всего менять не в Hex-файле, а в сконвертированном из него bin-файле (реализаций hex2bin.exe куча).
bin-файл - это линейный образ проги в памяти МК. Поэтому (чисто мое мнение), лучше создать свою секцию по определенному адресу и зная этот адрес можно изменить любую константу.
Пример, базовый адрес BASE=0x400, относительный адрес konst1 = 0x100, следовательно, абсолютный адрес konst1= BASE + 0x100 = 0x500 !!!!
Где можно почитать про эти bin? Как их лить в контроллер и чем бы скомпилировать? Памяти хватит. Также рассматривается вариант Т861, на всякий пожарный. Компилятор WinAVR-2010.

Сообщение отредактировал skyled - Jan 12 2011, 07:12
Go to the top of the page
 
+Quote Post
skyled
сообщение Jan 12 2011, 08:41
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Цитата
22.18.3.1 prog_char
Type of a "char" object located in flash ROM

Вот нашел в avr_libc. Это оно? Кто-то пользовал?
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jan 12 2011, 08:52
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
Где можно почитать про эти 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

У меня использовался массив, но можно сделать и набор любых объектов
Go to the top of the page
 
+Quote Post
777777
сообщение Jan 12 2011, 08:59
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



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


Все программы уже написаны до нас: http://smarttechnosoft.com/ihex/
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jan 12 2011, 09:03
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



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


У Вас есть лишние 20 бакинских?? Тогда лучше высылайте их мне!!!
Go to the top of the page
 
+Quote Post
777777
сообщение Jan 12 2011, 09:07
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(alexeyv @ Jan 12 2011, 15:03) *
У Вас есть лишние 20 бакинских?? Тогда лучше высылайте их мне!!!

Во-первых можно заставить купить вашего работодателя, пусть не жмотится.
Во-вторых, 30 строк можно редактировать бесплатно, мне этого хватает, я редактирую данные в EEPROM.
В-третьих, если не хватает, то можно уменьшить число строк, увеличив длину каждой строки, а на длину там ограничения нет (кажется).
Go to the top of the page
 
+Quote Post
skyled
сообщение Jan 12 2011, 09:33
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Я объявил в WinAVR массив и посмотрел как расположились мои данные. Тот факт, что они идут друг за другом несколько развязывает руки. Тепрь моя задача написать программу для редактирования этого hex-а. Собственно вопрос как правильно (алгоритм) разобрать этот файл.
Предположим я прочитал в массив файл (длянна известна и постоянна). В каком месте мне искать мои данные и куда писать подсчитанную контрольную сумму? Если я открою hex notepad-ом, то то что видится так и есть? Скрытого ничего нет? Для примера привожу сам hex и редактор (спасибо кому-то из форумчан). Мои данные лежат от адреса 0x000027 до 0x000044 включительно. Спасибо.
Прикрепленные файлы
Прикрепленный файл  prg_con.zip ( 261 байт ) Кол-во скачиваний: 20
Прикрепленный файл  HexFile_Editor.zip ( 275.95 килобайт ) Кол-во скачиваний: 23
 
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jan 12 2011, 09:51
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



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


Нахрена покупать, если мне работы на полтора часа, да и заодно 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 - Jan 12 2011, 09:52
Go to the top of the page
 
+Quote Post
skyled
сообщение Jan 12 2011, 10:00
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Предположим я преобразую hex в бинарный вид. Как мне там найти те байты, где мой массив лежит? Преобразование часом не заключается в том, чтобы выкинуть из hex лишнее?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 08:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01463 секунд с 7
ELECTRONIX ©2004-2016