Comment placer une variable à une adresse absolue donnée en mémoire (avec GCC)
le compilateur ARM C de RealView placer une variable à une adresse mémoire donnée en utilisant l'attribut variable at(address)
:
int var __attribute__((at(0x40001000)));
var = 4; // changes the memory located at 0x40001000
est-ce que GCC a un attribut variable similaire?
4 réponses
je ne sais pas, mais vous pouvez facilement créer une solution de contournement comme ceci:
int *var = (int*)0x40001000;
*var = 4;
Ce n'est pas exactement la même chose, mais dans la plupart des cas un substitut parfait. Cela fonctionnera avec n'importe quel compilateur, pas seulement GCC.
si vous utilisez GCC, je suppose que vous utilisez aussi GNU ld (bien que ce ne soit pas une certitude, bien sûr) et ld a un support pour placer des variables là où vous le souhaitez.
j'imagine laisser le linker faire ce travail est assez commun.
inspiré par la réponse de @rib, j'ajouterai que si l'adresse absolue est pour un registre de contrôle, j'ajouterais volatile
à la définition du pointeur. Si C'est juste RAM, ça n'a pas d'importance.
vous pourriez utiliser le attributs de section et un ld linker script pour définir l'adresse désirée pour cette section. C'est probablement plus désordonné que vos alternatives, mais c'est une option.
Vous avez répondu à votre question, Dans le lien ci-dessus, il est écrit:
avec le compilateur GNU GCC, vous pouvez utiliser seulement des 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-Attributes.html#Variable%20Attributes
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]);