Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Компактный бинарный файл
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
grisha_scorpion
После сборки проекта с использованием IAR на выходе получаю бинарный файл. В проекте используется глобальная строковая переменная, например: const char d[]={"qwexxxxasd"};
В бинарнике пытаюсь найти этот текст qwexxxxasd. Но вместо этого в бинарнике располагается: 'q','w','e',0xFC,'x',0x0C,'a','s','d' То есть IAR вместо 4-х символов 'x' в целях сокращения кода располагает какие то спецсимволы. Где можно узнать инфу по данному вопросу и как сделать так, чтобы в бинарнике у меня располагался полностью текст: qwexxxxasd?
aaarrr
Поищите в документации что-нибудь на тему "RW data compression"
Палыч
Не понятно: что же Вы хотите в конце-концов получить ?
Может быть Вам нужно использовать спецификатор __flash ?
Fujitser
Цитата(grisha_scorpion @ Jun 7 2013, 21:25) *
После сборки проекта с использованием IAR на выходе получаю бинарный файл. В проекте используется глобальная строковая переменная, например: const char d[]={"qwexxxxasd"};
В бинарнике пытаюсь найти этот текст qwexxxxasd. Но вместо этого в бинарнике располагается: 'q','w','e',0xFC,'x',0x0C,'a','s','d' То есть IAR вместо 4-х символов 'x' в целях сокращения кода располагает какие то спецсимволы. Где можно узнать инфу по данному вопросу и как сделать так, чтобы в бинарнике у меня располагался полностью текст: qwexxxxasd?


Э-э-э, отключить оптимизацию по размеру?
Непомнящий Евгений
aaarrr, а такое сжатие действительно возможно?

Это ж какая-то очень странная оптимизация - ведь компилятору придется обеспечить прозрачность для пользовательского кода, а с учетом того, что в С можно делать с указателями - это практически невозможно.

Может ТС что-то не так понял / ошибся?

Ну или это локальная переменная в какой-то простой функции и компилятор может это соптимизировать. В таком случае обычно помогает volatile.
aaarrr
Цитата(Непомнящий Евгений @ Jun 9 2013, 13:08) *
aaarrr, а такое сжатие действительно возможно?

Разумеется. Специально проверил - в справке находится на раз.
Непомнящий Евгений
Цитата(aaarrr @ Jun 9 2013, 13:48) *
Разумеется. Специально проверил - в справке находится на раз.


Судя по гуглу, это применяется для секции data, которая хранится во флеше в сжатом виде и расжимается при копировании в RAM при иниициализации.
У ТС же - const char, какой смысл тут сжимать? Ведь тогда придется копировать "расжатые" константы в ОЗУ...
aaarrr
Цитата(Непомнящий Евгений @ Jun 9 2013, 14:39) *
У ТС же - const char, какой смысл тут сжимать? Ведь тогда придется копировать "расжатые" константы в ОЗУ...

Что у ТС мы не ведаем, т.к. ни скрипта линкера ни map-файла не приложено. Но факт в том, что данные сжаты.
scifi
ТС пропал, а заниматься телепатией в попытке угадать, что именно ему нужно, - неблагодарное занятие. Вариантов много, так что гадать можно долго :-)
grisha_scorpion
Прошу прощения что не был в теме. Для чего мне всё это нужно: массив симоволов для меня - спец инфа(версия программы, дата создания и тд). Т.е. в бинарнике нужна полная несокращенная инфа. Анализируя этот бинарник, я определяю для себя всю специнфу.

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

Как у меня всё это реализовано: На самом деле у меня целая структура. Массив привел для примера. В этой структуре вся специнфа по программе. Соответсвенно если я объявляю эту структуру, то после компиляции она в бинарнике отражается, причем в произвольном месте. Так вот анализируя весь бинарник я нахожу строго определенную для меня последовательность(я использую ===), и всё что после этих трёх = я считаю специнфой с длиной тоже заданной мной.
Код
struct program_version
{
char start[4];
char name[10];
char version[3];
char sub_version[3];
char date[12];
char time[9];
char coment[30];
};

#define NAME          "loader"
#define COMMENT   "Специнфа по программе"

struct program_version ver = {"===", NAME, "01", "04", __DATE__,  __TIME__, COMENT};

Вопрос ко всем: кто как реализовывал тему с помещением специнфы в свой бинарник для дальнейшего его использования?
Проблема в том что компилятор в бинарник помещает переменную структуры в сокращенном виде(вместо 71 байта(4+10+3+3+12+9+30) у него может быть любое число в зависимости от текста), причем сокращает ту последовательность символов что повторяется 3 раза и более. С учетом всех этих сокращений на выходе я всегда буду иметь не строго фиксированную длину и соответственно возникает проблема извлечения полезной для меня инфы.


Вижу следующие пути решения этой ситуации:
1) узнать алгоритм сжатия и расжатия бинарного файла и применять его самому для извлечения полезной для меня инфы
2) установить какой то спецификатор к перемнной, который не будет сжимать в бинарнике переменную

Как реализовать эти 2 пункта я не знаю. Поэтому прошу помощи
scifi
Компилятор/линкер могут сжимать информацию для инициализации переменных. То есть если переменная в ОЗУ, то она инициализируется перед запуском main() данными из ПЗУ, причём данные разжимаются в процессе. Следовательно, объявите свою структуру так, чтобы она попала в ПЗУ, то есть const. Кажется, для AVR нужно писать __flash. Кстати, тогда она в точности будет соответствовать инициализаторам (с точностью до padding, если это не 8-битник).
Код
const struct program_version ver = {"===", NAME, "01", "04", __DATE__,  __TIME__, COMENT};
__flash struct program_version ver = {"===", NAME, "01", "04", __DATE__,  __TIME__, COMENT} // AVR;

Цитата(grisha_scorpion @ Jun 9 2013, 20:52) *
Так вот анализируя весь бинарник я нахожу строго определенную для меня последовательность(я использую ===), и всё что после этих трёх = я считаю специнфой с длиной тоже заданной мной.

Ну это совсем не комильфо именно по причине того, что такая последовательность может случайно сгенериться в другом месте. Правильнее расположить эту структуру по фиксированному адресу средствами линкера. Или хотя бы указатель на эту структуру.
grisha_scorpion
Цитата(scifi @ Jun 9 2013, 20:12) *
Компилятор/линкер могут сжимать информацию для инициализации переменных. То есть если переменная в ОЗУ, то она инициализируется перед запуском main() данными из ПЗУ, причём данные разжимаются в процессе. Следовательно, объявите свою структуру так, чтобы она попала в ПЗУ, то есть const. Кажется, для AVR нужно писать __flash. Кстати, тогда она в точности будет соответствовать инициализаторам (с точностью до padding, если это не 8-битник).

Ну это совсем не комильфо именно по причине того, что такая последовательность может случайно сгенериться в другом месте. Правильнее расположить эту структуру по фиксированному адресу средствами линкера. Или хотя бы указатель на эту структуру.


использование const будет актуально в моём случае, если не происходит в момент инициализации копирования моей переменной в другую область памяти. Но у меня в линкере указано копирование областей readonly и readwrite в другую область памяти. Такова необходимость.
Палыч
Цитата(grisha_scorpion @ Jun 9 2013, 20:52) *
2) установить какой то спецификатор к перемнной, который не будет сжимать в бинарнике переменную

Спецификатор __flash
grisha_scorpion
Цитата(Палыч @ Jun 9 2013, 21:35) *
Спецификатор __flash

Я так понял это для AVR. Я использую IAR for ARM
aaarrr
Цитата(grisha_scorpion @ Jun 9 2013, 23:46) *
Я так понял это для AVR. Я использую IAR for ARM

А документацию используемого инструмента читать не нужно?

Самое лобовое решение:
Код
initialize by copy with packing = none { readwrite };
grisha_scorpion
Цитата(aaarrr @ Jun 10 2013, 00:17) *
А документацию используемого инструмента читать не нужно?

Самое лобовое решение:
Код
initialize by copy with packing = none { readwrite };

Это способ для всего блока readwrite. А как сделать конкретно для переменной?
aaarrr
Цитата(grisha_scorpion @ Jun 10 2013, 01:40) *
А как сделать конкретно для переменной?

Поместить переменную в индивидуальную секцию, для секции прописать packing = none.
grisha_scorpion
С учётом всех предложений сделал следующее:
1)установил что переменная ver будет размещена в секции .version:
Код
#pragma location = ".version"
struct program_version ver = {"===", NAME, "01", "04", __DATE__,  __TIME__, COMENT};

2) в icf файле отключил сжатие для секции .version:
Код
initialize by copy with packing = none { section .version };


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






Цитата(aaarrr @ Jun 11 2013, 00:33) *
Поместить переменную в индивидуальную секцию, для секции прописать packing = none.

А есть еще помимо этого способы запретить сжимать переменные в бинарнике?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.