skyled 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Подскажите пожалуйста такую штуку. Мне нужно разместить 600 шт констант в памяти программ (t2313). В дальнейшем по необходимости редактировать непосредственно сам скомпилированный hex меняя значения констант, но без перекомпиляции. Редактировать и прошивать будет специальная программа. Собственно вопрос как адресно разместить константы в памяти программ чтобы точно знать какой байт в каком случае менять? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Для этого есть несколько вариантов. 1. Вы вообще не размещаете данный массив. При компиляции генерируете линкером файл map и в нём находите куда линкер его разместил. Соответственно в программе - редакторе задаёте адрес массива. Я бы пошёл этим путём. 2. Вы объявляете свою секцию в линкере, а в программе размещаете массив в данной секции. Адрес секции прописываете за пределами секции программ с какого-то кратного адреса. Этот адрес и используете для доступа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyled 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Файл map идея хорошая. Только чтобы не получилось, что надо отыскивать все 600. А так чтобы конкретно указать, что константа konst1 дложна лежать по адресу 0x0100 к примеру? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба по необходимости редактировать непосредственно сам скомпилированный hex меняя значения констант, но без перекомпиляции. Есть специальные правила оформления Hex-файла (т.е. формат файла), где ,например, в конце каждой строки записывается контрольная сумма этой строки. Кто ее будет пересчитывать? Вручную? или писать спец прогу для этого? Хотя у Вас будет своя прога для изменения и прошивки, но Вы тогда должны знать полный формат Hex-файла, чтобы определить позицию для изменения Лучше всего менять не в Hex-файле, а в сконвертированном из него bin-файле (реализаций hex2bin.exe куча). bin-файл - это линейный образ проги в памяти МК. Поэтому (чисто мое мнение), лучше создать свою секцию по определенному адресу и зная этот адрес можно изменить любую константу. Пример, базовый адрес BASE=0x400, относительный адрес konst1 = 0x100, следовательно, абсолютный адрес konst1= BASE + 0x100 = 0x500 !!!! Вопрос. Памяти 2К, а констант 600 байт. Следовательно, на прогу выходит 1448 байт. Хватит? или прога тупо пересылает эти константы в какое-либо устройство? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба ...чтобы конкретно указать, что константа konst1 дложна лежать по адресу 0x0100 к примеру? в скудном хэлпе на азм вы найдёте магическую дерективу .org применима к любому сегменту программы: коду, данным, статике... удачи вам (круглый) ...Редактировать и прошивать будет специальная программа. Собственно вопрос как адресно разместить константы в памяти программ чтобы точно знать какой байт в каком случае менять?.. если не боитесь доп. гимора с парсером хекс файла (собственно там ничего особенного нет - пару десяток строчек на сях), то отыскать нужное место можно по а) конкретному смещению. (как уже было сказано выше - инструкция .org вам в помощь) б) по определённой метке. (тут просто перед константой помещаете свою фамилию в текстовом виде. в последствии её и ищите в хексе) удачи вам (круглый) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GDI 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Редактировать и прошивать будет специальная программа. Собственно вопрос как адресно разместить константы в памяти программ чтобы точно знать какой байт в каком случае менять? Для ответа на этот вопрос надо знать какой у Вас компилятор. Как правило в препроцессоре есть директивы по размещению констант по определенному адресу. Но вот не помешает ли это линкеру размещать остальные переменные и саму программу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyled 0 12 января, 2011 Опубликовано 12 января, 2011 (изменено) · Жалоба Лучше всего менять не в Hex-файле, а в сконвертированном из него bin-файле (реализаций hex2bin.exe куча). bin-файл - это линейный образ проги в памяти МК. Поэтому (чисто мое мнение), лучше создать свою секцию по определенному адресу и зная этот адрес можно изменить любую константу. Пример, базовый адрес BASE=0x400, относительный адрес konst1 = 0x100, следовательно, абсолютный адрес konst1= BASE + 0x100 = 0x500 !!!! Где можно почитать про эти bin? Как их лить в контроллер и чем бы скомпилировать? Памяти хватит. Также рассматривается вариант Т861, на всякий пожарный. Компилятор WinAVR-2010. Изменено 12 января, 2011 пользователем skyled Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyled 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба 22.18.3.1 prog_char Type of a "char" object located in flash ROM Вот нашел в avr_libc. Это оно? Кто-то пользовал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Где можно почитать про эти 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 У меня использовался массив, но можно сделать и набор любых объектов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Есть специальные правила оформления Hex-файла (т.е. формат файла), где ,например, в конце каждой строки записывается контрольная сумма этой строки. Кто ее будет пересчитывать? Вручную? или писать спец прогу для этого? Все программы уже написаны до нас: http://smarttechnosoft.com/ihex/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Все программы уже написаны до нас У Вас есть лишние 20 бакинских?? Тогда лучше высылайте их мне!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба У Вас есть лишние 20 бакинских?? Тогда лучше высылайте их мне!!! Во-первых можно заставить купить вашего работодателя, пусть не жмотится. Во-вторых, 30 строк можно редактировать бесплатно, мне этого хватает, я редактирую данные в EEPROM. В-третьих, если не хватает, то можно уменьшить число строк, увеличив длину каждой строки, а на длину там ограничения нет (кажется). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyled 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Я объявил в WinAVR массив и посмотрел как расположились мои данные. Тот факт, что они идут друг за другом несколько развязывает руки. Тепрь моя задача написать программу для редактирования этого hex-а. Собственно вопрос как правильно (алгоритм) разобрать этот файл. Предположим я прочитал в массив файл (длянна известна и постоянна). В каком месте мне искать мои данные и куда писать подсчитанную контрольную сумму? Если я открою hex notepad-ом, то то что видится так и есть? Скрытого ничего нет? Для примера привожу сам hex и редактор (спасибо кому-то из форумчан). Мои данные лежат от адреса 0x000027 до 0x000044 включительно. Спасибо. prg_con.zip HexFile_Editor.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 12 января, 2011 Опубликовано 12 января, 2011 (изменено) · Жалоба Во-первых можно заставить купить вашего работодателя, пусть не жмотится. Нахрена покупать, если мне работы на полтора часа, да и заодно 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. сохраняешь результаты Я работал почти по первому варианту. Конвертирование в бин ставил в конце работы компилятора в настройках среды Мне известные программаторы принимали в качестве загрузочного файлы и ХЕКС и БИН Изменено 12 января, 2011 пользователем alexeyv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyled 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Предположим я преобразую hex в бинарный вид. Как мне там найти те байты, где мой массив лежит? Преобразование часом не заключается в том, чтобы выкинуть из hex лишнее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться