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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Компактный бинарный файл
grisha_scorpion
сообщение Jun 7 2013, 15:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 24-08-10
Пользователь №: 59 074



После сборки проекта с использованием IAR на выходе получаю бинарный файл. В проекте используется глобальная строковая переменная, например: const char d[]={"qwexxxxasd"};
В бинарнике пытаюсь найти этот текст qwexxxxasd. Но вместо этого в бинарнике располагается: 'q','w','e',0xFC,'x',0x0C,'a','s','d' То есть IAR вместо 4-х символов 'x' в целях сокращения кода располагает какие то спецсимволы. Где можно узнать инфу по данному вопросу и как сделать так, чтобы в бинарнике у меня располагался полностью текст: qwexxxxasd?

Сообщение отредактировал grisha_scorpion - Jun 7 2013, 15:26
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 7 2013, 15:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Поищите в документации что-нибудь на тему "RW data compression"
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 7 2013, 16:10
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Не понятно: что же Вы хотите в конце-концов получить ?
Может быть Вам нужно использовать спецификатор __flash ?
Go to the top of the page
 
+Quote Post
Fujitser
сообщение Jun 9 2013, 06:30
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 28-02-05
Из: Екатеринбург
Пользователь №: 2 925



Цитата(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?


Э-э-э, отключить оптимизацию по размеру?
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jun 9 2013, 09:08
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



aaarrr, а такое сжатие действительно возможно?

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

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

Ну или это локальная переменная в какой-то простой функции и компилятор может это соптимизировать. В таком случае обычно помогает volatile.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2013, 09:48
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Непомнящий Евгений @ Jun 9 2013, 13:08) *
aaarrr, а такое сжатие действительно возможно?

Разумеется. Специально проверил - в справке находится на раз.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jun 9 2013, 10:39
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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


Судя по гуглу, это применяется для секции data, которая хранится во флеше в сжатом виде и расжимается при копировании в RAM при иниициализации.
У ТС же - const char, какой смысл тут сжимать? Ведь тогда придется копировать "расжатые" константы в ОЗУ...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2013, 10:45
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Что у ТС мы не ведаем, т.к. ни скрипта линкера ни map-файла не приложено. Но факт в том, что данные сжаты.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 9 2013, 11:00
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



ТС пропал, а заниматься телепатией в попытке угадать, что именно ему нужно, - неблагодарное занятие. Вариантов много, так что гадать можно долго :-)
Go to the top of the page
 
+Quote Post
grisha_scorpion
сообщение Jun 9 2013, 16:52
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 24-08-10
Пользователь №: 59 074



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

- Если убрать полностью оптимизацию, то идет такое же сокращение моего массива.
- Соглашусь с тем что в стартапе при инициализации этой переменной идет полное копирование.
- 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 пункта я не знаю. Поэтому прошу помощи

Сообщение отредактировал IgorKossak - Jun 9 2013, 19:12
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 9 2013, 17:12
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Компилятор/линкер могут сжимать информацию для инициализации переменных. То есть если переменная в ОЗУ, то она инициализируется перед запуском 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) *
Так вот анализируя весь бинарник я нахожу строго определенную для меня последовательность(я использую ===), и всё что после этих трёх = я считаю специнфой с длиной тоже заданной мной.

Ну это совсем не комильфо именно по причине того, что такая последовательность может случайно сгенериться в другом месте. Правильнее расположить эту структуру по фиксированному адресу средствами линкера. Или хотя бы указатель на эту структуру.
Go to the top of the page
 
+Quote Post
grisha_scorpion
сообщение Jun 9 2013, 17:58
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 24-08-10
Пользователь №: 59 074



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

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


использование const будет актуально в моём случае, если не происходит в момент инициализации копирования моей переменной в другую область памяти. Но у меня в линкере указано копирование областей readonly и readwrite в другую область памяти. Такова необходимость.

Сообщение отредактировал grisha_scorpion - Jun 9 2013, 17:59
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 9 2013, 18:35
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(grisha_scorpion @ Jun 9 2013, 20:52) *
2) установить какой то спецификатор к перемнной, который не будет сжимать в бинарнике переменную

Спецификатор __flash
Go to the top of the page
 
+Quote Post
grisha_scorpion
сообщение Jun 9 2013, 19:46
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 24-08-10
Пользователь №: 59 074



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

Я так понял это для AVR. Я использую IAR for ARM

Сообщение отредактировал grisha_scorpion - Jun 9 2013, 19:47
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2013, 21:17
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

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

Самое лобовое решение:
Код
initialize by copy with packing = none { readwrite };
Go to the top of the page
 
+Quote Post

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

 


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


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