Есть ли способ загрузить двоичный файл как константную переменную в C во время компиляции?

Мне было интересно, есть ли способ загрузить внешний двоичный файл в качестве переменной в C через включение или файл заголовка или что-то в этом роде.

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

Теперь причина, по которой я упоминаю, что это встроенная система, заключается в том, что нет файловой системы для загрузки данных, только ОЗУ и программная память, поэтому любые «предварительные» данные или таблицы, которые я хочу использовать, должны быть загружены либо во время компиляции, либо через исходный файл или через объектный файл с помощью компоновщика. К сожалению, среда IDE не предоставляет каких-либо средств для загрузки двоичного файла в любой форме в память программы для использования в качестве кэша данных любым легко узнаваемым способом.

Если не делать того, что мне уже нужно, чтобы обойти это (используйте шестнадцатеричный редактор, чтобы прочитать двоичный файл в виде шестнадцатеричного кода ASCII, скопировать и вставить необработанные данные в файл заголовка в качестве переменной), есть ли способ «связать» в файл или «включить» файл, который можно загрузить как константную переменную во время компиляции?

Система, с которой я работаю, — это MPLAB X для процессоров серии Microchip, а компилятор — GNC. В основном я пытаюсь узнать, есть ли способ сделать это с помощью какой-либо команды или функции C, прежде чем я попытаюсь найти способ конкретно с помощью их конкретного программного обеспечения компилятора/компоновщика.


person balmerjd    schedule 17.03.2014    source источник
comment
Попробуйте xxd -i   -  person pmg    schedule 17.03.2014
comment
GCC не предоставляет эту функцию, но большинство ассемблеров, включая GAS, предоставляют для этой цели директиву .incbin. Обычно это удобнее интегрировать в ваши типичные системы сборки IDE по сравнению с отдельными конвертерами в данные C или объектные файлы.   -  person doynax    schedule 17.03.2014
comment
Метод, который я использовал, позволяет изменять экран/логотип/данные после компиляции (в программисте) и сохраняет их в пространстве программы. Я использовал его для калибровочных коэффициентов, переходя от единицы к расчетным, и это было надежно. Если интересно, отвечу, но в другой день.   -  person chip_wrangler    schedule 18.03.2014


Ответы (3)


Нет, вы не можете сделать это напрямую. Один из способов — преобразовать ваши двоичные файлы в исходный код C и включить эти фрагменты в ваш проект. Преобразование может быть выполнено с помощью простой программы, написанной вами, или какой-либо сторонней программой.

Например:

Binaray1.c (создается автоматически)

unsigned char binaray_file1[] =
{
  1,2,3,10,20,
  ....
} ;

Binaray2.c (создается автоматически)

unsigned char binaray_file2[] =
{
  0,0,10,20,45,32,212,
  ....
} ;

SomeSourceFile.c

extern unsigned char binary_file1[] ;
extern unsigned char binary_file2[] ;

// use binary_file1 and binary_file2 here.
person Jabberwocky    schedule 17.03.2014
comment
Спасибо за внимание. Это именно то, что я уже сделал, правда, я сделал это вручную, используя шестнадцатеричный редактор и IDE компилятора. - person balmerjd; 17.03.2014

Обычный способ сделать это в Unix-подобных системах — использовать ld -r binary. Вот руководство для Linux: http://www.burtonini.com/blog/computers/ld-blobs-2007-07-13-15-50

И один для Mac OS X, который немного сложнее: Скомпилируйте двоичный файл для подключения OSX

Идея состоит в том, чтобы компоновщик создал объектный файл с известными именами символов, которые указывают на начало и конец двоичного двоичного объекта, который он копирует в результирующий объектный файл. Затем вы связываете этот объектный файл со своим приложением и ссылаетесь на большой двоичный объект с помощью указателей extern char* или около того.

Я полагаю, вы знаете, как связывать объекты в вашей системе, поэтому остается вопрос, поддерживает ли ваш компоновщик что-то вроде -r binary.

person John Zwinck    schedule 17.03.2014
comment
На самом деле это был следующий шаг, если C не предусмотрел это изначально через исходные файлы. Для этого, однако, я собираюсь отправиться на форумы Microchip и расспросить там, чтобы узнать, сделал ли кто-нибудь что-то подобное. Поскольку компилятор и компоновщик Microchip предназначены специально для их встроенных систем, а не для какой-либо операционной системы, и основаны только на GNC, я полагаю, что было бы неуместно здесь углубляться в сценарии компоновщика и параметры командной строки. - person balmerjd; 17.03.2014

Конечно, вы можете изобрести свой собственный формат, но прежде чем вы это сделаете, взгляните на растровый формат XPM, который как раз предназначен для этой цели: интеграции растровых изображений в исходный код C.

person mfro    schedule 17.03.2014