【问题标题】:Is there a way to load a binary file as a const variable in C at compile time有没有办法在编译时将二进制文件作为 C 中的 const 变量加载
【发布时间】:2014-03-17 13:14:36
【问题描述】:

我想知道是否有一种方法可以通过包含或头文件或类似的东西将外部二进制文件作为 C 中的变量加载。

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

现在我提到它是嵌入式系统的原因是没有文件系统可以从中加载数据,只有 RAM 和程序内存,所以我希望使用的任何“预制”数据或表都必须加载通过源文件或使用链接器的目标文件编译时间。不幸的是,IDE 没有提供任何方法将二进制文件以任何形式加载到程序内存中,以便以任何易于识别的方式以这种方式用作数据缓存。

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

我使用的系统是用于 Microchip 系列处理器的 MPLAB X,编译器是 GNC。我主要想知道是否有办法通过一些 C 命令或函数来做到这一点,然后再尝试通过他们的特定编译器/链接器软件寻找一种方法。

【问题讨论】:

  • 试试xxd -i
  • GCC 不提供此功能,但包括 GAS 在内的大多数汇编程序确实为此目的提供了“.incbin”指令。与转换为 C 数据或目标文件的单独转换器相比,这通常更方便集成到您的典型 IDE 构建系统中
  • 我使用的方法在编译后启用屏幕/徽标/数据更改(在程序员处)并将其存储在程序空间中。我将它用于从统一到计算的校准系数,并且是可靠的。如果您有兴趣,我会回答,但改天。

标签: c embedded binary-data microchip


【解决方案1】:

不,您不能直接执行此操作。一种方法是将二进制文件转换为 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.

【讨论】:

  • 感谢您的提醒。这正是我已经完成的,虽然我是使用十六进制编辑器和编译器 IDE 手动完成的。
【解决方案2】:

在类 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 之类的东西。

【讨论】:

  • 实际上,如果 C 没有通过源文件本地提供它,那么这就是下一步。不过,为此,我将前往 Microchip 论坛并在那里询问是否有人做过类似的事情。由于 Microchip 编译器和链接器专门针对他们的嵌入式系统而不是任何操作系统,并且仅“基于”GNC,我认为在这里深入研究链接器脚本和命令行选项是不合适的。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2012-12-22
    • 2021-03-02
    • 2017-02-16
    • 2020-09-04
    相关资源
    最近更新 更多