Comment placer une variable à une adresse absolue donnée en mémoire (avec GCC)

Le compilateur RealView ARM C prend en charge le placement d’une variable à une adresse mémoire donnée à l’aide de l’atsortingbut variable at(address) :

 int var __atsortingbute__((at(0x40001000))); var = 4; // changes the memory located at 0x40001000 

GCC a-t-il un atsortingbut de variable similaire?

Je ne sais pas, mais vous pouvez facilement créer une solution de contournement comme celle-ci:

 int *var = (int*)0x40001000; *var = 4; 

Ce n’est pas exactement la même chose, mais dans la plupart des situations, un substitut parfait. Cela fonctionnera avec n’importe quel compilateur, pas seulement GCC.

Si vous utilisez GCC, je suppose que vous utilisez également GNU ld (bien que ce ne soit pas une certitude, bien sûr) et que ld prend en charge le placement de variables où vous le souhaitez .

J’imagine que laisser l’éditeur de liens faire ce travail est assez commun.

Inspiré par la réponse de @rib, j’appendai que si l’adresse absolue est pour un registre de contrôle, j’appendais volatile à la définition du pointeur. Si c’est juste de la RAM, cela n’a pas d’importance.

Vous pouvez utiliser les atsortingbuts de section et un script de l’éditeur de liens ld pour définir l’adresse souhaitée pour cette section. Ceci est probablement plus compliqué que vos alternatives, mais c’est une option.

Vous avez répondu à votre question. Le lien ci-dessus indique:

Avec le compilateur GNU GCC, vous ne pouvez utiliser que les définitions de pointeur pour accéder aux emplacements de mémoire absolue. Par exemple:

 #define IOPIN0 (*((volatile unsigned long *) 0xE0028000)) IOPIN0 = 0x4; 

Btw http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Variable-Atsortingbutes.html#Variable%20Atsortingbutes

  extern const uint8_t dev_serial[12]; asm(".equ dev_serial, 0x1FFFF7E8"); /* or asm("dev_serial = 0x1FFFF7E8"); */ ... for (i = 0 ; i < sizeof(dev_serial); i++) printf((char *)"%02x ", dev_serial[i]);