punteros para acceder a la memoria

0

¡Se requiere una respuesta rápida!

#define PortA_Data (*(volatile unsigned long*)0x40004000)

aquí, en este ejemplo, vinculé PortA_Data con una dirección, ¿puede algún cuerpo explicar el mecanismo de este código, hay puntero a dirección, hay un puntero a tipo de retorno, hay alguna función aquí? No puedo entender lo que significa. Sé de punteros pero hay algo desordenado, realmente me molesta.

    
pregunta Sajjad Ahmed

4 respuestas

2

"0x40004000" es un entero hexadecimal. Presumiblemente, el número entero es una dirección de memoria de alguna documentación específica de la CPU

"volatile unsigned long *" es una descripción de un tipo. Específicamente, el tipo que describe es un puntero volátil (los punteros volátiles deshabilitan ciertas optimizaciones que serían inapropiadas para un acceso de hardware como este) a un largo sin firmar.

"el valor (tipo)" en C es un encasillado.

Así que "(volatile unsigned long *) 0x40004000" toma 0x40004000 y lo convierte en un volatile unsigned long *.

El * cerca del principio le dice al compilador que elimine la referencia al puntero. Eso es para acceder a lo que sea en la ubicación señalada por el puntero.

Finalmente, los corchetes externos son para asegurarse de que todo en la macro permanezca agrupado si se usa como parte de una operación más grande.

Entonces, al juntarlo todo cuando usamos su macro en una expresión, le pedimos al compilador que lea / escriba la dirección de memoria 0x40004000 como un valor largo sin firmar (probablemente un valor de 32 bits sin signo)

    
respondido por el Peter Green
0

No. Hay una dirección, un encasillado y una desreferencia. El primero es solo un número entero que representa la ubicación en la memoria en cuestión. Los dos últimos son mecanismos específicos de C para que el compilador trate un valor de una manera específica.

    
respondido por el Ignacio Vazquez-Abrams
0

Dividámoslo para ver qué está pasando (estoy de acuerdo con Ignacio, quizás esto pueda ayudar)

'#define PortA_Data': Asigna lo que viene junto al nombre simbólico PortA_Data

(*: es un puntero

(volatile unsigned long *): una transmisión tipográfica para definir esto como un tipo específico de puntero. La palabra clave volátil evitará que la variable se optimice ya que el compilador no verá propósito válido para la variable .

0x40004000): con este valor hexadecimal

Para usarlo podemos hacer algo como

mydata long unsigned; // declarar una variable

mydata = * (PortA_Data); // recupere lo que sea que esté en la dirección 0x40004000 en un tipo de datos largo sin firmar.

    
respondido por el Peter Smith
0

Ahora tengo la idea completa y el concepto de mi pregunta, ahora puedo responder a mí mismo :)

typecast convierte cualquier dato en otro tipo de datos, como char var_1; /* convert 65 into char */ var_1 = (char)65; /* for pointer (my case) */ unsigned long *pointer; /* assigning address to this pointer required typecast */ pointer = (unsigned long*)0x40004000; /* now we can read and write at this address*/ /* or can use this concept to ease our self in different ways*/ /* assigning value to address */ *pointer = 233; printf("%i",*pointer);

y la salida será: 233 en esa dirección 0x40004000

    
respondido por el Sajjad Ahmed

Lea otras preguntas en las etiquetas