|
Компактный бинарный файл |
|
|
|
Jun 7 2013, 15:25
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 9 2013, 06:30
|
Местный
  
Группа: Свой
Сообщений: 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? Э-э-э, отключить оптимизацию по размеру?
|
|
|
|
|
Jun 9 2013, 10:39
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(aaarrr @ Jun 9 2013, 13:48)  Разумеется. Специально проверил - в справке находится на раз. Судя по гуглу, это применяется для секции data, которая хранится во флеше в сжатом виде и расжимается при копировании в RAM при иниициализации. У ТС же - const char, какой смысл тут сжимать? Ведь тогда придется копировать "расжатые" константы в ОЗУ...
|
|
|
|
|
Jun 9 2013, 16:52
|
Участник

Группа: Участник
Сообщений: 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] - для короткого!!!
|
|
|
|
|
Jun 9 2013, 17:12
|
Гуру
     
Группа: Свой
Сообщений: 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)  Так вот анализируя весь бинарник я нахожу строго определенную для меня последовательность(я использую ===), и всё что после этих трёх = я считаю специнфой с длиной тоже заданной мной. Ну это совсем не комильфо именно по причине того, что такая последовательность может случайно сгенериться в другом месте. Правильнее расположить эту структуру по фиксированному адресу средствами линкера. Или хотя бы указатель на эту структуру.
|
|
|
|
|
Jun 9 2013, 17:58
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 9 2013, 19:46
|
Участник

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

|
Цитата(Палыч @ Jun 9 2013, 21:35)  Спецификатор __flash Я так понял это для AVR. Я использую IAR for ARM
Сообщение отредактировал grisha_scorpion - Jun 9 2013, 19:47
|
|
|
|
|
Jun 9 2013, 21:17
|
Гуру
     
Группа: Свой
Сообщений: 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 };
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|