有没有办法在编译时将二进制文件作为const变量加载到C中

时间:2014-03-17 13:14:36

标签: c embedded binary-data microchip

我想知道是否有办法通过include或头文件或类似的方式将外部二进制文件作为C中的变量加载。

例如,在我正在进行的项目中,我正在使用嵌入式系统,该系统具有使用ASCII数据和命令进行文本和次要图形(框,线等)的图形显示。但是,它也会显示单色位图。所以我有一系列用于用户界面的静态显示,以及一些用于启动画面的位图。

现在我提到它是一个嵌入式系统的原因是没有文件系统来加载数据,只有RAM和程序存储器,所以我希望使用的任何“预制”数据或表必须加载到使用链接器通过源文件或通过目标文件编译时间。遗憾的是,IDE没有提供任何方法将二进制文件(实际上是任何形式)加载到程序存储器中,以任何易于识别的方式用作数据缓存。

没有做我已经解决的问题,(使用十六进制编辑器将二进制文件读取为ASCII编码的十六进制,并将原始数据作为变量复制并粘贴到头文件中),有没有办法“链接”到文件或“包含”可以在编译时作为const变量加载的文件?

我正在使用的系统是用于Microchip系列处理器的MPLAB X,编译器是GNC。在我尝试通过特定的编译器/链接器软件寻找方法之前,我主要想知道是否有办法通过一些C命令或函数来实现这一点。

3 个答案:

答案 0 :(得分:5)

不,你不能直接这样做。一种方法是将二进制文件转换为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.

答案 1 :(得分:4)

在类Unix系统上执行此操作的常用方法是使用ld -r binary。这是Linux的教程: http://www.burtonini.com/blog/computers/ld-blobs-2007-07-13-15-50

Mac OS X的一个,有点复杂: Compile a binary file for linking OSX

这个想法是让链接器创建一个具有已知符号名称的目标文件,该文件指向二进制blob的开头和结尾,并将其复制到生成的目标文件中。然后,将该对象文件链接到您的应用程序,并通过extern char*指针左右引用blob。

我想您知道如何链接系统上的对象,因此剩下的问题是您的链接器是否支持-r binary之类的内容。

答案 2 :(得分:0)

当然你可以发明你自己的格式,但在你这样做之前:看看XPM bitmap format这正是为了这个目的:将pixmaps集成到C源代码中。