Est-il possible de charger un fichier binary en tant que variable const en C lors de la compilation

Je me demandais s’il existait un moyen de charger un fichier binary externe en tant que variable en C par le biais d’un fichier d’inclusion, d’un fichier d’en-tête ou autre.

Par exemple, dans un projet sur lequel je travaille actuellement, je travaille avec un système intégré doté d’un affichage graphique capable de générer du texte et des graphiques mineurs (blocs, lignes, etc.) à l’aide de données et de commandes ASCII. Mais, il affichera également des bitmaps monochromes. J’ai donc une série d’affichages statiques que j’utilise pour une interface utilisateur et quelques images bitmap pour les écrans de démarrage.

Maintenant, la raison pour laquelle je mentionne qu’il s’agit d’un système embarqué, c’est qu’il n’ya pas de système de fichiers pour charger des données, mais uniquement de la RAM et de la mémoire programme; via un fichier source ou via un fichier object à l’aide de l’éditeur de liens. Malheureusement, l’EDI ne fournit aucun moyen de charger un fichier binary, sous quelque forme que ce soit, dans la mémoire de programme afin de l’utiliser comme cache de données de cette manière, de manière facilement reconnaissable.

Donc, à moins de faire ce que je dois déjà contourner (utiliser un éditeur hexadécimal pour lire le binary en tant que fichier encodé en ASCII et copier-coller les données brutes dans un fichier d’en-tête en tant que variable), existe-t-il un moyen de “lier” dans un fichier ou “inclure” un fichier qui pourrait être chargé en tant que variable const lors de la compilation?

Le système sur lequel je travaille est MPLAB X pour la série de processeurs Microchip et le compilateur est GNC. Je cherche principalement à savoir s’il existe un moyen de le faire via une commande ou une fonction C avant d’essayer de rechercher un moyen spécifique par le biais de leur logiciel spécifique de compilateur / éditeur de liens.

Non, vous ne pouvez pas faire cela directement. Une solution consiste à convertir vos fichiers binarys en code source C et à inclure ces éléments dans votre projet. La conversion peut être effectuée par un simple programme écrit par vous ou par un programme tiers.

Par exemple:

Binaray1.c (généré automatiquement)

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

Binaray2.c (généré automatiquement)

 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. 

La manière habituelle de faire cela sur les systèmes de type Unix consiste à utiliser ld -r binary . Voici un tutoriel pour Linux: http://www.burtonini.com/blog/computers/ld-blobs-2007-07-13-15-50

Et un pour Mac OS X, qui est un peu plus complexe: Comstackz un fichier binary pour lier OSX

L’idée est de faire en sorte que l’éditeur de liens crée un fichier object avec des noms de symbole connus qui pointent au début et à la fin d’un blob binary qu’il copie dans le fichier object résultant. Vous liez ensuite ce fichier object à votre application et référencez le blob via extern char* pointers ou autre.

Je suppose que vous savez comment lier des objects sur votre système, la question qui rest est donc de savoir si votre éditeur de liens supporte quelque chose comme -r binary .

Bien sûr, vous pouvez inventer votre propre format, mais avant cela, jetez un œil au format XPM bitmap, qui est exactement conçu à cet effet: intégrer des images au format C.