Как разместить переменную по заданному абсолютному адресу в памяти (с помощью GCC)

компилятор RealView ARM c поддерживает размещение переменной по заданному адресу памяти с помощью атрибута переменной at(address):

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

имеет ли GCC аналогичный атрибут переменной?

4 ответов


Я не знаю, но вы можете легко создать обходной путь такой:

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

это не ровно то же самое, но в большинстве случаев прекрасно заменяет. Он будет работать с любым компилятором, а не только с GCC.

Если вы используете GCC, я предполагаю, что вы также используете GNU ld (хотя это, конечно, не уверенность), и ld поддерживает размещение переменных везде, где вы хотите их.

Я представляю, что позволяю компоновщику делать эта работа довольно распространена.

вдохновленный ответом @rib, я добавлю, что если абсолютный адрес для некоторого контрольного регистра, я бы добавил volatile на определение указателя. Если это просто рам, это не имеет значения.


можно использовать атрибуты и ld скрипт линкера чтобы определить желаемый адрес для этого раздела. Это, вероятно, грязнее, чем ваши альтернативы, но это вариант.


вы ответили на свой вопрос, В вашей ссылке выше говорится:

с компилятором GNU GCC вы можете использовать только определения указателей для доступа к абсолютным местоположениям памяти. Например:

#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]);