Question

Pour un système embarqué, il est nécessaire de placer quelques structures de données à des adresses fixes, de sorte qu'un processeur de contrôle séparé puisse y accéder à un emplacement connu. Pour ce faire, j'utilise des scripts de l'éditeur de liens pour la cible intégrée, ainsi que # définitions de ces mêmes adresses pour la CPU de contrôle.

Cela me dérange que ces constantes d'adresse soient donc définies à deux endroits, le script de l'éditeur de liens et un fichier d'en-tête. J'aimerais en avoir un seul. La meilleure solution que j'ai trouvée jusqu'ici consiste à faire en sorte que Makefile exécute cpp sur le script de l'éditeur de liens, lui permettant d'inclure le même en-tête.

Existe-t-il un meilleur moyen de réaliser cela? Existe-t-il une option peu connue de ld ou une convention de dénomination pour le script de l'éditeur de liens qui l'exécutera automatiquement via cpp?

Était-ce utile?

La solution

Ce n’est pas tout à fait la solution que vous recherchez, mais une option consiste à utiliser le système de construction pour configurer ces valeurs. Créez un fichier config.h.in et un fichier target.ld.in qui agissent en tant que modèles et demandez au système de construction de produire un fichier config.h avec la définition correcte et un fichier target.ld avec l'adresse correcte pour la cible que vous créez.

Nous utilisons CMake pour nos systèmes intégrés et cela prend en charge ce genre de choses. GNU autoconf aussi, mais je ne l’ai jamais vraiment aimé personnellement.

Autres conseils

Vous pouvez utiliser la construction @ spécifique à C intégré 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 MCU 32 bits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top