Puntero a una dirección de memoria de memoria Flash

0

Creo que la siguiente pregunta es simple, pero es importante que yo sepa.

Estoy trabajando en microcontroladores. He visto algunos códigos para acceder a los datos de la memoria flash.

Por ejemplo, para leer el contenido de la dirección 0xA010 del flash, está el siguiente código:

           #define ADDRESS_TO_READ      0xA010

           uint8 *Read_Ptr = NULL;
           Read_Ptr = (uint8 *) ADDRESS_TO_READ;
           value = *Read_Ptr; 

Esto está funcionando bien. Mi pregunta aquí es, ya que Read_Ptr es uint8, ¿cómo almacena el valor 0xA010, que es un valor corto (Dirección de 16 bits)? ¿Cómo ocurrirán las funciones de lectura y escritura en esta memoria, cuando el puntero es uint8?

    
pregunta rock_buddy

3 respuestas

4
  

Dado que Read_Ptr es uint8 ...

Excepto que no lo es. Es uint8* .

ptr_t , que es (debería ser) el tipo de punteros en una arquitectura, por mucho que la arquitectura considere que es y es completamente independiente del tamaño del valor que el compilador está buscando en esa ubicación específica.

    
respondido por el Ignacio Vazquez-Abrams
1

El puntero solo contendrá la dirección. El tipo de puntero es el tipo de datos que espera encontrar en esa dirección. Por lo tanto, un (uint8 *) le proporcionará los datos de uint8 de la dirección que especificó.

Si tenemos un ejemplo como este donde cada dirección contiene un byte de datos

address 0x0000     0x00001     0x0010     0x0011     0x0010
data      0x00        0x21       0x34       0x55       0x69

uint8 *Read_Ptr = NULL;
ReadPptr = (uint8*)0x00000
value = *Read_Ptr

value = 0x00 porque se carga en la dirección 0x0000 y se leen datos uint8

Pero si hacemos esto

uint16 *Read_Ptr = NULL;
ReadPptr = (uint16*)0x00000
value = *Read_Ptr

value = 0x0021 porque se está cargando en la dirección 0x0000, pero está leyendo datos uint16 que serían los contenidos de 0x0000 y 0x0001

Otro ejemplo sería

uint64 *Read_Ptr = NULL;
ReadPptr = (uint64*)0x00001
value = *Read_Ptr

valor = 0x21345569

Se supone que el valor se declara lo suficientemente grande como para contener el tamaño de los datos de lectura. No lea (uint64 *) cuando su variable de valor es solo uint8. Será truncado.

    
respondido por el efox29
0

un puntero siempre es lo suficientemente grande para una dirección.

    
respondido por el Richard Williams

Lea otras preguntas en las etiquetas