Para aplicaciones integradas, a menudo es necesario acceder a ubicaciones de memoria fija para registros periféricos. La manera estándar que he encontrado para hacer esto es algo como lo siguiente:Variable de dirección fija en C
// access register 'foo_reg', which is located at address 0x100
#define foo_reg *(int *)0x100
foo_reg = 1; // write to foo_reg
int x = foo_reg; // read from foo_reg
entiendo cómo funciona, pero lo que no entiendo es cómo se asigna el espacio para foo_reg (es decir, lo que mantiene el enlazador poniendo otra variable en 0x100?). ¿Se puede reservar el espacio en el nivel C, o tiene que haber una opción de enlazador que especifique que nada debe ubicarse en 0x100? Estoy usando las herramientas de GNU (gcc, ld, etc.), así que estoy más interesado en los detalles de ese conjunto de herramientas en este momento.
Alguna información adicional sobre mi arquitectura para aclarar la cuestión:
Mis interfaces de procesador a un FPGA a través de un conjunto de registros mapeados en el espacio de datos regular (donde viven las variables) del procesador. Así que debo señalar esos registros y bloquear el espacio de direcciones asociado. En el pasado, he usado un compilador que tenía una extensión para ubicar variables desde el código C. Me agrupar los registros en una estructura, a continuación, colocar la estructura en el lugar adecuado:
typedef struct
{
BYTE reg1;
BYTE reg2;
...
} Registers;
Registers regs _at_ 0x100;
regs.reg1 = 0;
creación de una estructura realidad 'Registros' se reserva el espacio en los ojos del compilador/enlazador de.
Ahora, usando las herramientas GNU, obviamente no tengo el en la extensión. Uso del método de puntero:
#define reg1 *(BYTE*)0x100;
#define reg2 *(BYTE*)0x101;
reg1 = 0
// or
#define regs *(Registers*)0x100
regs->reg1 = 0;
Esta es una aplicación simple sin sistema operativo ni administración de memoria avanzada. Básicamente:
void main()
{
while(1){
do_stuff();
}
}
En realidad, el enlazador sí lo hace, a través de una secuencia de comandos del enlazador que define las regiones de memoria disponibles para su uso. Define (por ejemplo) regiones .text y .bss para datos constantes y datos volátiles (RAM), respectivamente. – strager
de hecho, en la intención de decir sin hacer nada, no hay posibilidad de que lo sepa :) –
¿'defsym' realmente asigna algo a una dirección determinada? AFAIK es esencialmente un linker equivalente a '# define', ni siquiera se puede especificar el tamaño del objeto con él, y no impedirá que el enlazador coloque otra variable en la misma dirección. –