2008-09-26 5 views
1

Pour un système embarqué, j'ai besoin de placer quelques structures de données à des adresses fixes, afin qu'une unité centrale de contrôle séparée puisse y accéder à un emplacement connu. J'utilise des scripts de lieur pour la cible incorporée pour accomplir ceci, plus #defines de ces mêmes adresses pour le CPU de contrôle.#defines dans les scripts de liens

Cela me dérange que ces constantes d'adresse sont donc définies à deux endroits, le script de l'éditeur de liens et un fichier d'en-tête. Je voudrais en avoir juste un. La meilleure solution que j'ai trouvée jusqu'ici est d'avoir le Makefile exécuté cpp sur le script de l'éditeur de liens, lui permettant #include le même en-tête.

Existe-t-il un meilleur moyen d'y parvenir? Y a-t-il une option peu connue à ld ou une convention de nommage pour le script de l'éditeur de liens qui l'exécutera automatiquement via cpp?

+0

Serait utile de savoir quelle chaîne d'outils vous utilisez car il s'agit d'un comportement non-standard – Benoit

+0

gcc 3.x, s'exécutant sur Linux x86 mais compilé de manière croisée pour construire pour MIPS. – DGentry

Répondre

3

Ce n'est pas tout à fait la solution que vous recherchez mais une option consiste à utiliser le système de compilation pour configurer ces valeurs. Créez un fichier config.h.in et un fichier target.ld.in qui agit comme des modèles et dont le système de construction produit un fichier config.h avec le bon define et un fichier target.ld avec l'adresse correcte pour la cible que vous construisez.

Nous utilisons CMake pour nos systèmes embarqués et il supporte ce genre de chose. GNU autoconf fait aussi mais je n'ai jamais vraiment aimé ça personnellement.

+2

C'est ce que j'ai fini par faire. Je cours "cpp -P" sur un manuscrit d'entrée pour produire le manuscrit final d'éditeur de liens. – DGentry

0

Vous pouvez utiliser la construction spécifique C emdedded-C pour placer un objet n'importe où dans l'espace adresse.

static struct SOMESTRUCT somestruct @ 0x40000000; 
extern int someextint @ 0x3ffffffc; 
char somebuffer[77] @ 0x80000000; 

En supposant un microcontrôleur 32 bits.

Questions connexes