2010-03-05 18 views
10

¿Cómo se asigna una dirección de memoria específica a un puntero?Puntero a una dirección fija específica

Los registros de funciones especiales en un microcontrolador como AVR m128 tienen direcciones fijas, AVR GCC define el SFR en el archivo de encabezado io.h, pero quiero manejarlo yo mismo.

Respuesta

28

Claro, no hay problema. Usted sólo puede asignar directamente a una variable:

volatile unsigned int *myPointer = (volatile unsigned int *)0x12345678; 

Lo que suelo hacer es declarar una E/S macro memoria mapeada:

#define mmio32(x) (*(volatile unsigned long *)(x)) 

y luego definir mis registros en un archivo de cabecera:

#define SFR_BASE (0xCF800000) 
#define SFR_1  (SFR_BASE + 0x0004) 
#define SFR_2  (SFR_BASE + 0x0010) 

Y luego usarlos:

unsigned long registerValue = mmio32(SFR_1); // read 
mmio32(SFR2) = 0x85748312;     // write 
+2

I w Debería haber usado un puntero de vacío genérico, a menos que los datos en esa ubicación sean un int sin firmar. –

+1

Por lo general, es una buena idea declarar direcciones de E/S mapeadas en memoria como 'volátiles'. –

+0

@Sean, quiere acceder a un registro mapeado en la memoria. No se puede desreferenciar un puntero 'void', ¿para qué sirve? –

Cuestiones relacionadas