2010-11-01 20 views
19

El RealView ARM C Compiler supports la colocación de una variable en una dirección de memoria dada usando el atributo variable de at(address):¿Cómo poner una variable en una dirección absoluta dada en la memoria (con GCC)

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

¿Tiene GCC tienen una atributo variable similar?

+1

Escribí un [artículo] (http://a3f.at/articles/register-syntax-sugar), donde enumero los medios para hacerlo. Puede ser útil para algunos. – a3f

Respuesta

18

No sé, pero se 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 los casos un sustituto perfecto. Funcionará con cualquier compilador, no solo GCC.

Si utiliza GCC, supongo que también utiliza GNU ld (aunque no es una certeza, por supuesto) y ld tiene soporte para la colocación de las variables wherever you want them.

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 solo es RAM, no importa.

+0

+1 para la creatividad. No sé si realmente funciona, pero suena realmente plausible, así como portátil (en el sentido de que debería funcionar para todos los compiladores). – falstro

+1

@roe: es un truco bastante estándar que se puede usar en controladores de dispositivos para hardware con registros de control mapeados de memoria fija. En una aplicación de usuario estándar, no tiene utilidad alguna que yo pueda pensar. – JeremyP

+0

@JeremyP, en dispositivos integrados, especialmente aquellos sin MMU, es muy común que las "aplicaciones de usuario" lleguen al hardware. –

8

podría utilizar el section attributes y un ld linker script para definir la dirección deseada para esa sección. Esto es probablemente más desordenado que sus alternativas, pero es una opción.

+3

Tenga en cuenta que este enfoque * reservará * espacio para la variable, en lugar de simplemente suponer que existe en la dirección especificada. En muchos casos, esto es lo que quieres. – larskholte

+0

Un enlace más directo para los atributos de sección: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#Common- Variable-Attributes y ctrl + f para "section" – Ponkadoodle

0
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]); 
+0

¿Qué significa esto? a las respuestas existentes? – OrangeDog

+0

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. Por favor, intente no saturar su código con comentarios explicativos, ¡esto reduce la legibilidad tanto del código como de las explicaciones! –

Cuestiones relacionadas