Как разместить переменную по заданному абсолютному адресу в памяти (с помощью 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]);