Cómo colocar una variable en una dirección absoluta dada en la memoria(con GCC)
variables arm (4)
No lo sé, pero puede crear fácilmente una solución como esta:
int *var = (int*)0x40001000;
*var = 4;
No es exactamente lo mismo, pero en la mayoría de las situaciones un sustituto perfecto. Funcionará con cualquier compilador, no solo con GCC.
Si usa GCC, asumo que también usa GNU ld (aunque no es una certeza, por supuesto) y ld tiene soporte para colocar variables donde quiera que las desee .
Me imagino que dejar que el enlazador haga ese trabajo es bastante común.
Inspirado por la respuesta de @rib, agregaré que si la dirección absoluta es para algún registro de control, agregaría volatile
a la definición del puntero. Si es solo RAM, no importa.
El compilador RealView ARM C supports colocar una variable en una dirección de memoria determinada usando el atributo variable at(address)
:
int var __attribute__((at(0x40001000)));
var = 4; // changes the memory located at 0x40001000
¿Tiene GCC un atributo variable similar?
Podría usar los atributos de la sección y un script del enlazador ld para definir la dirección deseada para esa sección. Probablemente esto sea más desordenado que sus alternativas, pero es una opción.
Usted respondió a su pregunta, en su enlace anterior dice:
Con el compilador GNU GCC puede usar solo definiciones de puntero para acceder a ubicaciones de memoria absoluta. Por ejemplo:
#define IOPIN0 (*((volatile unsigned long *) 0xE0028000))
IOPIN0 = 0x4;
Por cierto 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]);