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?

20
demandé sur Prof. Falken 2010-11-01 12:38:52

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.

18
répondu Prof. Falken 2016-12-08 09:18:49

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.

11
répondu Thomas M. DuBuisson 2010-11-02 19:54:05

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

5
répondu rib 2010-11-01 11:11:59
    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]);
2
répondu user6409471 2016-06-01 12:00:46