cembeddedbinary-datamicrochip

Is there a way to load a binary file as a const variable in C at compile time


I was wondering if there is a way to load an external binary file as a variable in C through an include or a header file or something of the like.

For example, in a project I am currently working on I am working with an embedded system that has a graphic display that will do text and minor graphics (boxes, lines, etc.) using ASCII data and commands. But, it will also display monochrome bitmaps. So I have a series of static displays that I use for a user interface, and a couple of bitmaps for splash screens.

Now the reason I mention that it is an embedded system is that there is no file system to load data from, only RAM and program memory, so any "pre-fab" data or tables I wish to use must but loaded at compile time either through a source file or through an object file using the linker. Unfortunately, the IDE does not provide any means to load a binary, in any form really, into program memory for use as a data cache in this fashion in any readily recognizable fashion.

So short of doing what I already have to get around this, (use a hex editor to read the binary as ASCII encoded hex and copy and paste the raw data into a header file as a variable), is there a way to "link" to a file or "include" a file that could be loaded as a const variable at compile time?

The system I am working with is MPLAB X for the Microchip series of processors and the compiler is GNC. I am mainly looking to know if there is a way to do this through some C command or function before I go trying to look for a way specifically through their specific compiler/linker software.


Solution

  • No you can't do this directly. One way is to convert your binary files into C source code and include these pieces into your project. The conversion can be done by a simple program written by you or by some third party program.

    For example:

    Binaray1.c (generated automatically)

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

    Binaray2.c (generated automatically)

    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.